1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.files.ccsds.ndm.cdm;
18  
19  import java.net.URISyntaxException;
20  import java.util.ArrayList;
21  
22  import org.hipparchus.util.FastMath;
23  import org.junit.jupiter.api.Assertions;
24  import org.junit.jupiter.api.BeforeEach;
25  import org.junit.jupiter.api.Test;
26  import org.orekit.Utils;
27  import org.orekit.bodies.CelestialBodyFactory;
28  import org.orekit.data.DataContext;
29  import org.orekit.data.DataSource;
30  import org.orekit.errors.OrekitException;
31  import org.orekit.errors.OrekitMessages;
32  import org.orekit.files.ccsds.definitions.BodyFacade;
33  import org.orekit.files.ccsds.definitions.CelestialBodyFrame;
34  import org.orekit.files.ccsds.definitions.PocMethodType;
35  import org.orekit.files.ccsds.definitions.YesNoUnknown;
36  import org.orekit.files.ccsds.ndm.ParserBuilder;
37  import org.orekit.files.ccsds.ndm.odm.ocm.ObjectType;
38  import org.orekit.frames.FramesFactory;
39  import org.orekit.time.AbsoluteDate;
40  import org.orekit.time.TimeOffset;
41  import org.orekit.time.TimeScalesFactory;
42  import org.orekit.utils.IERSConventions;
43  
44  public class CdmParserTest {
45  
46      private static final double DISTANCE_PRECISION = 1e-8;
47      private static final double DOUBLE_PRECISION = 1e-8;
48      private static final double DERIVATION_PRECISION = 1e-12;
49      private static final double COVARIANCE_DIAG_PRECISION = 1e-10;
50      private static final double COVARIANCE_PRECISION = 1e-8;
51  
52      @BeforeEach
53      public void setUp() {
54          Utils.setDataRoot("regular-data");
55      }
56  
57      @Test
58      public void testParseCDM1() {
59          /* Test for CdmExample1.txt, with only required data. */
60          // File
61          final String ex = "/ccsds/cdm/CDMExample1.txt";
62  
63          // Initialize the parser
64          final CdmParser parser = new ParserBuilder().buildCdmParser();
65  
66          final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
67  
68          // Generated CDM file
69          final Cdm file = parser.parseMessage(source);
70  
71          // Verify general data
72          Assertions.assertEquals(IERSConventions.IERS_2010, file.getConventions());
73          Assertions.assertEquals(DataContext.getDefault(), file.getDataContext());
74  
75          // Check Header Block
76          Assertions.assertEquals(1.0, file.getHeader().getFormatVersion(), 1.0e-10);
77          Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12,
78                                                   TimeScalesFactory.getUTC()), file.getHeader().getCreationDate());
79          Assertions.assertEquals("JSPOC", file.getHeader().getOriginator());
80          Assertions.assertEquals("201113719185", file.getHeader().getMessageId());
81  
82          // OBJECT1
83          // Check Relative Metadata Block
84          Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 618, TimeOffset.MILLISECOND),
85                                                   TimeScalesFactory.getUTC()), file.getRelativeMetadata().getTca());
86          Assertions.assertEquals(715.0, file.getRelativeMetadata().getMissDistance(), DISTANCE_PRECISION);
87  
88          // Check Metadata Block
89          Assertions.assertEquals("OBJECT1", file.getMetadataObject1().getObject());
90          Assertions.assertEquals("12345", file.getMetadataObject1().getObjectDesignator());
91          Assertions.assertEquals("SATCAT", file.getMetadataObject1().getCatalogName());
92          Assertions.assertEquals("SATELLITE A", file.getMetadataObject1().getObjectName());
93          Assertions.assertEquals("1997−030E", file.getMetadataObject1().getInternationalDes());
94          Assertions.assertEquals("EPHEMERIS SATELLITE A", file.getMetadataObject1().getEphemName());
95          Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject1().getCovarianceMethod());
96          Assertions.assertEquals(Maneuvrable.YES, file.getMetadataObject1().getManeuverable());
97          Assertions.assertEquals(CelestialBodyFrame.EME2000,
98                                  file.getMetadataObject1().getRefFrame().asCelestialBodyFrame());
99          Assertions.assertEquals("UTC", file.getMetadataObject1().getTimeSystem().name());
100 
101         // Check data block
102         // State vector block
103         Assertions.assertEquals(2570.097065e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getX(),
104                                 DISTANCE_PRECISION);
105         Assertions.assertEquals(2244.654904e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getY(),
106                                 DISTANCE_PRECISION);
107         Assertions.assertEquals(6281.497978e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getZ(),
108                                 DISTANCE_PRECISION);
109         Assertions.assertEquals(4.418769571e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getX(),
110                                 DERIVATION_PRECISION);
111         Assertions.assertEquals(4.833547743e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getY(),
112                                 DERIVATION_PRECISION);
113         Assertions.assertEquals(-3.526774282e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getZ(),
114                                 DERIVATION_PRECISION);
115         // Covariance Matrix block
116         Assertions.assertEquals(4.142e1, file.getDataObject1().getRTNCovarianceBlock().getCrr(),
117                                 COVARIANCE_DIAG_PRECISION);
118         Assertions.assertEquals(-8.579, file.getDataObject1().getRTNCovarianceBlock().getCtr(),
119                                 COVARIANCE_DIAG_PRECISION);
120         Assertions.assertEquals(2.533e3, file.getDataObject1().getRTNCovarianceBlock().getCtt(),
121                                 COVARIANCE_DIAG_PRECISION);
122         Assertions.assertEquals(-2.313e1, file.getDataObject1().getRTNCovarianceBlock().getCnr(),
123                                 COVARIANCE_DIAG_PRECISION);
124         Assertions.assertEquals(1.336e1, file.getDataObject1().getRTNCovarianceBlock().getCnt(),
125                                 COVARIANCE_DIAG_PRECISION);
126         Assertions.assertEquals(7.098e1, file.getDataObject1().getRTNCovarianceBlock().getCnn(),
127                                 COVARIANCE_DIAG_PRECISION);
128 
129         Assertions.assertEquals(2.520e-3, file.getDataObject1().getRTNCovarianceBlock().getCrdotr(),
130                                 COVARIANCE_PRECISION);
131         Assertions.assertEquals(-5.476, file.getDataObject1().getRTNCovarianceBlock().getCrdott(),
132                                 COVARIANCE_PRECISION);
133         Assertions.assertEquals(8.626e-4, file.getDataObject1().getRTNCovarianceBlock().getCrdotn(),
134                                 COVARIANCE_PRECISION);
135         Assertions.assertEquals(5.744e-3, file.getDataObject1().getRTNCovarianceBlock().getCrdotrdot(),
136                                 COVARIANCE_PRECISION);
137 
138         Assertions.assertEquals(-1.006e-2, file.getDataObject1().getRTNCovarianceBlock().getCtdotr(),
139                                 COVARIANCE_PRECISION);
140         Assertions.assertEquals(4.041e-3, file.getDataObject1().getRTNCovarianceBlock().getCtdott(),
141                                 COVARIANCE_PRECISION);
142         Assertions.assertEquals(-1.359e-3, file.getDataObject1().getRTNCovarianceBlock().getCtdotn(),
143                                 COVARIANCE_PRECISION);
144         Assertions.assertEquals(-1.502e-5, file.getDataObject1().getRTNCovarianceBlock().getCtdotrdot(),
145                                 COVARIANCE_PRECISION);
146         Assertions.assertEquals(1.049e-5, file.getDataObject1().getRTNCovarianceBlock().getCtdottdot(),
147                                 COVARIANCE_PRECISION);
148 
149         Assertions.assertEquals(1.053e-3, file.getDataObject1().getRTNCovarianceBlock().getCndotr(),
150                                 COVARIANCE_PRECISION);
151         Assertions.assertEquals(-3.412e-3, file.getDataObject1().getRTNCovarianceBlock().getCndott(),
152                                 COVARIANCE_PRECISION);
153         Assertions.assertEquals(1.213e-2, file.getDataObject1().getRTNCovarianceBlock().getCndotn(),
154                                 COVARIANCE_PRECISION);
155         Assertions.assertEquals(-3.004e-6, file.getDataObject1().getRTNCovarianceBlock().getCndotrdot(),
156                                 COVARIANCE_PRECISION);
157         Assertions.assertEquals(-1.091e-6, file.getDataObject1().getRTNCovarianceBlock().getCndottdot(),
158                                 COVARIANCE_PRECISION);
159         Assertions.assertEquals(5.529e-5, file.getDataObject1().getRTNCovarianceBlock().getCndotndot(),
160                                 COVARIANCE_PRECISION);
161 
162         Assertions.assertEquals(2.520e-3, file.getDataObject1().getRTNCovarianceBlock().
163                                 getRTNCovarianceMatrix().getEntry(3, 0), COVARIANCE_PRECISION);
164         Assertions.assertEquals(Double.NaN, file.getDataObject1().getRTNCovarianceBlock().
165                                 getRTNCovarianceMatrix().getEntry(7, 6), COVARIANCE_PRECISION);
166 
167 
168 
169         // OBJECT2
170         // Check Relative Metadata Block
171         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getTca(),
172                                 file.getRelativeMetadata().getTca());
173         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getMissDistance(),
174                                 file.getRelativeMetadata().getMissDistance(), DISTANCE_PRECISION);
175 
176         // Check Metadata Block
177         Assertions.assertEquals("OBJECT2", file.getMetadataObject2().getObject());
178         Assertions.assertEquals("30337", file.getMetadataObject2().getObjectDesignator());
179         Assertions.assertEquals("SATCAT", file.getMetadataObject2().getCatalogName());
180         Assertions.assertEquals("FENGYUN 1C DEB", file.getMetadataObject2().getObjectName());
181         Assertions.assertEquals("1999-025AA", file.getMetadataObject2().getInternationalDes());
182         Assertions.assertEquals("NONE", file.getMetadataObject2().getEphemName());
183         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject2().getCovarianceMethod());
184         Assertions.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
185         Assertions.assertEquals(CelestialBodyFrame.EME2000,
186                                 file.getMetadataObject2().getRefFrame().asCelestialBodyFrame());
187         Assertions.assertEquals("UTC", file.getMetadataObject2().getTimeSystem().name());
188 
189         // Check data block
190         Assertions.assertEquals(2569.540800e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getX(),
191                                 DISTANCE_PRECISION);
192         Assertions.assertEquals(2245.093614e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getY(),
193                                 DISTANCE_PRECISION);
194         Assertions.assertEquals(6281.599946e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getZ(),
195                                 DISTANCE_PRECISION);
196         Assertions.assertEquals(-2.888612500e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getX(),
197                                 DERIVATION_PRECISION);
198         Assertions.assertEquals(-6.007247516e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getY(),
199                                 DERIVATION_PRECISION);
200         Assertions.assertEquals(3.328770172e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getZ(),
201                                 DERIVATION_PRECISION);
202         // Covariance Matrix block
203         Assertions.assertEquals(1.337e3, file.getDataObject2().getRTNCovarianceBlock().getCrr(),
204                                 COVARIANCE_DIAG_PRECISION);
205         Assertions.assertEquals(-4.806e4, file.getDataObject2().getRTNCovarianceBlock().getCtr(),
206                                 COVARIANCE_DIAG_PRECISION);
207         Assertions.assertEquals(2.492e6, file.getDataObject2().getRTNCovarianceBlock().getCtt(),
208                                 COVARIANCE_DIAG_PRECISION);
209         Assertions.assertEquals(-3.298e1, file.getDataObject2().getRTNCovarianceBlock().getCnr(),
210                                 COVARIANCE_DIAG_PRECISION);
211         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(),
212                                 COVARIANCE_DIAG_PRECISION);
213         Assertions.assertEquals(7.105e1, file.getDataObject2().getRTNCovarianceBlock().getCnn(),
214                                 COVARIANCE_DIAG_PRECISION);
215 
216         Assertions.assertEquals(2.591e-3, file.getDataObject2().getRTNCovarianceBlock().getCrdotr(),
217                                 COVARIANCE_PRECISION);
218         Assertions.assertEquals(-4.152e-2, file.getDataObject2().getRTNCovarianceBlock().getCrdott(),
219                                 COVARIANCE_PRECISION);
220         Assertions.assertEquals(-1.784e-6, file.getDataObject2().getRTNCovarianceBlock().getCrdotn(),
221                                 COVARIANCE_PRECISION);
222         Assertions.assertEquals(6.886e-5, file.getDataObject2().getRTNCovarianceBlock().getCrdotrdot(),
223                                 COVARIANCE_PRECISION);
224 
225         Assertions.assertEquals(-1.016e-2, file.getDataObject2().getRTNCovarianceBlock().getCtdotr(),
226                                 COVARIANCE_PRECISION);
227         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getCtdott(),
228                                 COVARIANCE_PRECISION);
229         Assertions.assertEquals(1.637e-3, file.getDataObject2().getRTNCovarianceBlock().getCtdotn(),
230                                 COVARIANCE_PRECISION);
231         Assertions.assertEquals(-2.987e-6, file.getDataObject2().getRTNCovarianceBlock().getCtdotrdot(),
232                                 COVARIANCE_PRECISION);
233         Assertions.assertEquals(1.059e-5, file.getDataObject2().getRTNCovarianceBlock().getCtdottdot(),
234                                 COVARIANCE_PRECISION);
235 
236         Assertions.assertEquals(4.400e-3, file.getDataObject2().getRTNCovarianceBlock().getCndotr(),
237                                 COVARIANCE_PRECISION);
238         Assertions.assertEquals(8.482e-3, file.getDataObject2().getRTNCovarianceBlock().getCndott(),
239                                 COVARIANCE_PRECISION);
240         Assertions.assertEquals(8.633e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotn(),
241                                 COVARIANCE_PRECISION);
242         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getCndotrdot(),
243                                 COVARIANCE_PRECISION);
244         Assertions.assertEquals(-4.594e-6, file.getDataObject2().getRTNCovarianceBlock().getCndottdot(),
245                                 COVARIANCE_PRECISION);
246         Assertions.assertEquals(5.178e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotndot(),
247                                 COVARIANCE_PRECISION);
248         // Test in the matrix
249         Assertions.assertEquals(1.337e3, file.getDataObject2().getRTNCovarianceBlock().getCrr(),
250                                 COVARIANCE_DIAG_PRECISION);
251         Assertions.assertEquals(-4.806e4, file.getDataObject2().getRTNCovarianceBlock().getCtr(),
252                                 COVARIANCE_DIAG_PRECISION);
253         Assertions.assertEquals(2.492e6, file.getDataObject2().getRTNCovarianceBlock().getCtt(),
254                                 COVARIANCE_DIAG_PRECISION);
255         Assertions.assertEquals(-3.298e1, file.getDataObject2().getRTNCovarianceBlock().getCnr(),
256                                 COVARIANCE_DIAG_PRECISION);
257         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(),
258                                 COVARIANCE_DIAG_PRECISION);
259         Assertions.assertEquals(7.105e1, file.getDataObject2().getRTNCovarianceBlock().getCnn(),
260                                 COVARIANCE_DIAG_PRECISION);
261 
262         Assertions.assertEquals(2.591e-3,
263                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 0),
264                                 COVARIANCE_PRECISION);
265         Assertions.assertEquals(-4.152e-2,
266                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 1),
267                                 COVARIANCE_PRECISION);
268         Assertions.assertEquals(-1.784e-6,
269                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 2),
270                                 COVARIANCE_PRECISION);
271         Assertions.assertEquals(6.886e-5,
272                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 3),
273                                 COVARIANCE_PRECISION);
274 
275         Assertions.assertEquals(-1.016e-2,
276                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 0),
277                                 COVARIANCE_PRECISION);
278         Assertions.assertEquals(-1.506e-4,
279                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 1),
280                                 COVARIANCE_PRECISION);
281         Assertions.assertEquals(1.637e-3,
282                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 2),
283                                 COVARIANCE_PRECISION);
284         Assertions.assertEquals(-2.987e-6,
285                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 3),
286                                 COVARIANCE_PRECISION);
287         Assertions.assertEquals(1.059e-5,
288                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 4),
289                                 COVARIANCE_PRECISION);
290 
291         Assertions.assertEquals(4.400e-3,
292                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 0),
293                                 COVARIANCE_PRECISION);
294         Assertions.assertEquals(8.482e-3,
295                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 1),
296                                 COVARIANCE_PRECISION);
297         Assertions.assertEquals(8.633e-5,
298                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 2),
299                                 COVARIANCE_PRECISION);
300         Assertions.assertEquals(-1.903e-6,
301                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 3),
302                                 COVARIANCE_PRECISION);
303         Assertions.assertEquals(-4.594e-6,
304                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 4),
305                                 COVARIANCE_PRECISION);
306         Assertions.assertEquals(5.178e-5,
307                                 file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 5),
308                                 COVARIANCE_PRECISION);
309 
310     }
311 
312     @Test
313     public void testParseCDM2() {
314         /* Test for CdmExample2.txt, with only required data. */
315         // File
316         final String ex = "/ccsds/cdm/CDMExample2.txt";
317 
318         // Initialize the parser
319         final CdmParser parser = new ParserBuilder().buildCdmParser();
320 
321         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
322 
323         // Generated CDM file
324         final Cdm file = parser.parseMessage(source);
325 
326         Assertions.assertEquals(IERSConventions.IERS_2010, file.getConventions());
327         Assertions.assertEquals(DataContext.getDefault(), file.getDataContext());
328 
329         // Check Header Block
330         Assertions.assertEquals(1.0, file.getHeader().getFormatVersion(), 1.0e-10);
331         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12,
332                                                  TimeScalesFactory.getUTC()), file.getHeader().getCreationDate());
333         Assertions.assertEquals("JSPOC", file.getHeader().getOriginator());
334         Assertions.assertEquals("201113719185", file.getHeader().getMessageId());
335 
336         // OBJECT1
337         // Check Relative Metadata Block
338         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 618, TimeOffset.MILLISECOND),
339                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getTca());
340         Assertions.assertEquals(715.0, file.getRelativeMetadata().getMissDistance(), DISTANCE_PRECISION);
341         Assertions.assertEquals(14762.0, file.getRelativeMetadata().getRelativeSpeed(), DERIVATION_PRECISION);
342         Assertions.assertEquals(27.4, file.getRelativeMetadata().getRelativePosition().getX(), DISTANCE_PRECISION);
343         Assertions.assertEquals(-70.2, file.getRelativeMetadata().getRelativePosition().getY(), DISTANCE_PRECISION);
344         Assertions.assertEquals(711.8, file.getRelativeMetadata().getRelativePosition().getZ(), DISTANCE_PRECISION);
345         Assertions.assertEquals(-7.2, file.getRelativeMetadata().getRelativeVelocity().getX(), DERIVATION_PRECISION);
346         Assertions.assertEquals(-14692.0, file.getRelativeMetadata().getRelativeVelocity().getY(),
347                                 DERIVATION_PRECISION);
348         Assertions.assertEquals(-1437.2, file.getRelativeMetadata().getRelativeVelocity().getZ(), DERIVATION_PRECISION);
349         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 18, 29, new TimeOffset(32, TimeOffset.SECOND, 212, TimeOffset.MILLISECOND),
350                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStartScreenPeriod());
351         Assertions.assertEquals(new AbsoluteDate(2010, 3, 15, 18, 29, new TimeOffset(32, TimeOffset.SECOND, 212, TimeOffset.MILLISECOND),
352                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStopScreenPeriod());
353         Assertions.assertEquals(ScreenVolumeFrame.RTN, file.getRelativeMetadata().getScreenVolumeFrame());
354         Assertions.assertEquals(ScreenVolumeShape.ELLIPSOID, file.getRelativeMetadata().getScreenVolumeShape());
355         Assertions.assertEquals(200, file.getRelativeMetadata().getScreenVolumeX(), 0);
356         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeY(), 0);
357         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeZ(), 0);
358         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 222, TimeOffset.MILLISECOND),
359                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenEntryTime());
360         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 824, TimeOffset.MILLISECOND),
361                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenExitTime());
362         Assertions.assertEquals(4.835E-05, file.getRelativeMetadata().getCollisionProbability(), 1e-30);
363         Assertions.assertEquals("FOSTER-1992", file.getRelativeMetadata().getCollisionProbaMethod().getName());
364         Assertions.assertEquals(PocMethodType.FOSTER_1992,
365                                 file.getRelativeMetadata().getCollisionProbaMethod().getType());
366 
367         // Check Metadata Block
368         Assertions.assertEquals("OBJECT1", file.getMetadataObject1().getObject());
369         Assertions.assertEquals(ObjectType.PAYLOAD, file.getMetadataObject1().getObjectType());
370         Assertions.assertEquals("OSA", file.getMetadataObject1().getOperatorContactPosition());
371         Assertions.assertEquals("EUMETSAT", file.getMetadataObject1().getOperatorOrganization());
372         Assertions.assertEquals("+49615130312", file.getMetadataObject1().getOperatorPhone());
373         Assertions.assertEquals("JOHN.DOE@SOMEWHERE.NET", file.getMetadataObject1().getOperatorEmail());
374         Assertions.assertEquals("EPHEMERIS SATELLITE A", file.getMetadataObject1().getEphemName());
375         Assertions.assertEquals(FramesFactory.getEME2000(), file.getMetadataObject1().getFrame());
376         Assertions.assertEquals("JACCHIA 70 DCA", file.getMetadataObject1().getAtmosphericModel());
377         Assertions.assertEquals("EGM-96", file.getMetadataObject1().getGravityModel());
378         Assertions.assertEquals(36, file.getMetadataObject1().getGravityDegree(), 0);
379         Assertions.assertEquals(36, file.getMetadataObject1().getGravityOrder(), 0);
380         Assertions.assertEquals("MOON", file.getMetadataObject1().getNBodyPerturbations().get(0).getName());
381         Assertions.assertEquals("SUN", file.getMetadataObject1().getNBodyPerturbations().get(1).getName());
382         Assertions.assertEquals("NO", file.getMetadataObject1().getSolarRadiationPressure().name());
383         Assertions.assertEquals("NO", file.getMetadataObject1().getEarthTides().name());
384         Assertions.assertEquals("NO", file.getMetadataObject1().getIntrackThrust().name());
385         Assertions.assertEquals("UTC", file.getMetadataObject1().getTimeSystem().name());
386 
387         // Check data block
388         // OD parameters block
389         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 2, 14,
390                                                  new TimeOffset(12, TimeOffset.SECOND, 746, TimeOffset.MILLISECOND),
391                                                  TimeScalesFactory.getUTC()),
392                                 file.getDataObject1().getODParametersBlock().getTimeLastObsStart());
393         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 2, 14,
394                                                  new TimeOffset(12, TimeOffset.SECOND, 746, TimeOffset.MILLISECOND),
395                                                  TimeScalesFactory.getUTC()),
396                                 file.getDataObject1().getODParametersBlock().getTimeLastObsEnd());
397         Assertions.assertEquals(7.88*3600.0*24.0, file.getDataObject1().getODParametersBlock().getRecommendedOdSpan(),
398                                 DOUBLE_PRECISION);
399         Assertions.assertEquals(5.50*3600.0*24.0, file.getDataObject1().getODParametersBlock().getActualOdSpan(),
400                                 DOUBLE_PRECISION);
401         Assertions.assertEquals(592, file.getDataObject1().getODParametersBlock().getObsAvailable(), DOUBLE_PRECISION);
402         Assertions.assertEquals(579, file.getDataObject1().getODParametersBlock().getObsUsed(), DOUBLE_PRECISION);
403         Assertions.assertEquals(123, file.getDataObject1().getODParametersBlock().getTracksAvailable(),
404                                 DOUBLE_PRECISION);
405         Assertions.assertEquals(119, file.getDataObject1().getODParametersBlock().getTracksUsed(), DOUBLE_PRECISION);
406         Assertions.assertEquals(97.8/100.0, file.getDataObject1().getODParametersBlock().getResidualsAccepted(),
407                                 DOUBLE_PRECISION);
408         Assertions.assertEquals(0.864, file.getDataObject1().getODParametersBlock().getWeightedRMS(), DOUBLE_PRECISION);
409         // Additional parameters block
410         Assertions.assertEquals(5.2, file.getDataObject1().getAdditionalParametersBlock().getAreaPC(),
411                                 DOUBLE_PRECISION);
412         Assertions.assertEquals(251.6, file.getDataObject1().getAdditionalParametersBlock().getMass(),
413                                 DOUBLE_PRECISION);
414         Assertions.assertEquals(0.045663, file.getDataObject1().getAdditionalParametersBlock().getCDAreaOverMass(),
415                                 DOUBLE_PRECISION);
416         Assertions.assertEquals(0.000000, file.getDataObject1().getAdditionalParametersBlock().getCRAreaOverMass(),
417                                 DOUBLE_PRECISION);
418         Assertions.assertEquals(0.0, file.getDataObject1().getAdditionalParametersBlock().getThrustAcceleration(),
419                                 DOUBLE_PRECISION);
420         Assertions.assertEquals(4.54570E-05, file.getDataObject1().getAdditionalParametersBlock().getSedr(),
421                                 DOUBLE_PRECISION);
422         // State vector block
423         Assertions.assertEquals(2570.097065e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getX(),
424                                 DISTANCE_PRECISION);
425         Assertions.assertEquals(4.833547743e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getY(),
426                                 DERIVATION_PRECISION);
427         // Covariance Matrix block
428         Assertions.assertEquals(4.142e1, file.getDataObject1().getRTNCovarianceBlock().getCrr(),
429                                 COVARIANCE_DIAG_PRECISION);
430         Assertions.assertEquals(-8.579, file.getDataObject1().getRTNCovarianceBlock().getCtr(),
431                                 COVARIANCE_DIAG_PRECISION);
432         Assertions.assertEquals(2.533e3, file.getDataObject1().getRTNCovarianceBlock().getCtt(),
433                                 COVARIANCE_DIAG_PRECISION);
434         Assertions.assertEquals(-2.313e1, file.getDataObject1().getRTNCovarianceBlock().getCnr(),
435                                 COVARIANCE_DIAG_PRECISION);
436         Assertions.assertEquals(1.336e1, file.getDataObject1().getRTNCovarianceBlock().getCnt(),
437                                 COVARIANCE_DIAG_PRECISION);
438         Assertions.assertEquals(7.098e1, file.getDataObject1().getRTNCovarianceBlock().getCnn(),
439                                 COVARIANCE_DIAG_PRECISION);
440 
441         Assertions.assertEquals(-1.862E+00, file.getDataObject1().getRTNCovarianceBlock().getCdrgr(),
442                                 COVARIANCE_DIAG_PRECISION);
443         Assertions.assertEquals(3.530E+00, file.getDataObject1().getRTNCovarianceBlock().getCdrgt(),
444                                 COVARIANCE_DIAG_PRECISION);
445         Assertions.assertEquals(-3.100E-01, file.getDataObject1().getRTNCovarianceBlock().getCdrgn(),
446                                 COVARIANCE_DIAG_PRECISION);
447         Assertions.assertEquals(-1.214E-04, file.getDataObject1().getRTNCovarianceBlock().getCdrgrdot(),
448                                 COVARIANCE_DIAG_PRECISION);
449         Assertions.assertEquals(2.580E-04, file.getDataObject1().getRTNCovarianceBlock().getCdrgtdot(),
450                                 COVARIANCE_DIAG_PRECISION);
451         Assertions.assertEquals(-6.467E-05, file.getDataObject1().getRTNCovarianceBlock().getCdrgndot(),
452                                 COVARIANCE_DIAG_PRECISION);
453         Assertions.assertEquals(3.483E-06, file.getDataObject1().getRTNCovarianceBlock().getCdrgdrg(),
454                                 COVARIANCE_DIAG_PRECISION);
455 
456         Assertions.assertEquals(-1.492E+02, file.getDataObject1().getRTNCovarianceBlock().getCsrpr(),
457                                 COVARIANCE_DIAG_PRECISION);
458         Assertions.assertEquals(2.044E+02, file.getDataObject1().getRTNCovarianceBlock().getCsrpt(),
459                                 COVARIANCE_DIAG_PRECISION);
460         Assertions.assertEquals(-2.331E+01, file.getDataObject1().getRTNCovarianceBlock().getCsrpn(),
461                                 COVARIANCE_DIAG_PRECISION);
462         Assertions.assertEquals(-1.254E-03, file.getDataObject1().getRTNCovarianceBlock().getCsrprdot(),
463                                 COVARIANCE_DIAG_PRECISION);
464         Assertions.assertEquals(2.013E-02, file.getDataObject1().getRTNCovarianceBlock().getCsrptdot(),
465                                 COVARIANCE_DIAG_PRECISION);
466         Assertions.assertEquals(-4.700E-03, file.getDataObject1().getRTNCovarianceBlock().getCsrpndot(),
467                                 COVARIANCE_DIAG_PRECISION);
468         Assertions.assertEquals(2.210E-04, file.getDataObject1().getRTNCovarianceBlock().getCsrpdrg(),
469                                 COVARIANCE_DIAG_PRECISION);
470         Assertions.assertEquals(1.593E-02, file.getDataObject1().getRTNCovarianceBlock().getCsrpsrp(),
471                                 COVARIANCE_DIAG_PRECISION);
472 
473 
474         // OBJECT2
475         // Check Relative Metadata Block
476         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getScreenVolumeX(),
477                                 file.getRelativeMetadata().getScreenVolumeX(), DISTANCE_PRECISION);
478         Assertions.assertEquals(
479                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativePosition().getY(),
480                                 file.getRelativeMetadata().getRelativePosition().getY(), DISTANCE_PRECISION);
481         Assertions.assertEquals(
482                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativeVelocity().getZ(),
483                                 file.getRelativeMetadata().getRelativeVelocity().getZ(), DERIVATION_PRECISION);
484         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbability(),
485                                 file.getRelativeMetadata().getCollisionProbability(), 1e-30);
486         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbaMethod(),
487                                 file.getRelativeMetadata().getCollisionProbaMethod());
488 
489         // Check Metadata Block
490         Assertions.assertEquals("OBJECT2", file.getMetadataObject2().getObject());
491         Assertions.assertEquals("30337", file.getMetadataObject2().getObjectDesignator());
492         Assertions.assertEquals("SATCAT", file.getMetadataObject2().getCatalogName());
493         Assertions.assertEquals("FENGYUN 1C DEB", file.getMetadataObject2().getObjectName());
494         Assertions.assertEquals("1999-025AA", file.getMetadataObject2().getInternationalDes());
495         Assertions.assertEquals("NONE", file.getMetadataObject2().getEphemName());
496         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject2().getCovarianceMethod());
497         Assertions.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
498         Assertions.assertEquals(CelestialBodyFrame.EME2000,
499                                 file.getMetadataObject2().getRefFrame().asCelestialBodyFrame());
500         Assertions.assertEquals("UTC", file.getMetadataObject2().getTimeSystem().name());
501 
502         // Check data block
503         Assertions.assertEquals(2569.540800e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getX(),
504                                 DISTANCE_PRECISION);
505         Assertions.assertEquals(-2.888612500e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getX(),
506                                 DERIVATION_PRECISION);
507         // Covariance Matrix block
508         Assertions.assertEquals(1.337e3, file.getDataObject2().getRTNCovarianceBlock().getCrr(),
509                                 COVARIANCE_DIAG_PRECISION);
510         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(),
511                                 COVARIANCE_DIAG_PRECISION);
512 
513         Assertions.assertEquals(2.591e-3, file.getDataObject2().getRTNCovarianceBlock().getCrdotr(),
514                                 COVARIANCE_PRECISION);
515         Assertions.assertEquals(6.886e-5, file.getDataObject2().getRTNCovarianceBlock().getCrdotrdot(),
516                                 COVARIANCE_PRECISION);
517 
518         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getCtdott(),
519                                 COVARIANCE_PRECISION);
520         Assertions.assertEquals(1.059e-5, file.getDataObject2().getRTNCovarianceBlock().getCtdottdot(),
521                                 COVARIANCE_PRECISION);
522 
523         Assertions.assertEquals(8.633e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotn(),
524                                 COVARIANCE_PRECISION);
525         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getCndotrdot(),
526                                 COVARIANCE_PRECISION);
527 
528         Assertions.assertEquals(-5.117E-01, file.getDataObject2().getRTNCovarianceBlock().getCdrgr(),
529                                 COVARIANCE_PRECISION);
530         Assertions.assertEquals(1.319E+00, file.getDataObject2().getRTNCovarianceBlock().getCdrgt(),
531                                 COVARIANCE_PRECISION);
532         Assertions.assertEquals(-1.903E-05, file.getDataObject2().getRTNCovarianceBlock().getCdrgndot(),
533                                 COVARIANCE_PRECISION);
534         Assertions.assertEquals(7.402E-05, file.getDataObject2().getRTNCovarianceBlock().getCdrgtdot(),
535                                 COVARIANCE_PRECISION);
536         Assertions.assertEquals(-3.297E+01, file.getDataObject2().getRTNCovarianceBlock().getCsrpr(),
537                                 COVARIANCE_PRECISION);
538         Assertions.assertEquals(8.164E+01, file.getDataObject2().getRTNCovarianceBlock().getCsrpt(),
539                                 COVARIANCE_PRECISION);
540 
541         // Verify comments
542         Assertions.assertEquals("[Relative Metadata/Data]", file.getRelativeMetadata().getComment().toString());
543         Assertions.assertEquals("[Object1 Metadata]", file.getMetadataObject1().getComments().toString());
544         Assertions.assertEquals("[Object2 Metadata]", file.getMetadataObject2().getComments().toString());
545         Assertions.assertEquals("[Object1 Data]", file.getDataObject1().getComments().toString());
546         Assertions.assertEquals("[Object1 OD Parameters]",
547                                 file.getDataObject1().getODParametersBlock().getComments().toString());
548         Assertions.assertEquals("[Object2 OD Parameters]",
549                                 file.getDataObject2().getODParametersBlock().getComments().toString());
550         Assertions.assertEquals(
551                                 "[Object1 Additional Parameters, Apogee Altitude=779 km, Perigee Altitude=765 km, Inclination=86.4 deg]",
552                                 file.getDataObject1().getAdditionalParametersBlock().getComments().toString());
553         Assertions.assertEquals(
554                                 "[Object2 Additional Parameters, Apogee Altitude=786 km, Perigee Altitude=414 km, Inclination=98.9 deg]",
555                                 file.getDataObject2().getAdditionalParametersBlock().getComments().toString());
556 
557     }
558 
559     @Test
560     public void testParseCDM3() {
561         /* Test for CdmExample3.txt, with only required data. */
562         // File
563         final String ex = "/ccsds/cdm/CDMExample3.txt";
564 
565         // Initialize the parser
566         final CdmParser parser = new ParserBuilder().buildCdmParser();
567 
568         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
569 
570         // Generated CDM file
571         final Cdm file = parser.parseMessage(source);
572 
573 
574         Assertions.assertEquals(IERSConventions.IERS_2010, file.getConventions());
575         Assertions.assertEquals(DataContext.getDefault(), file.getDataContext());
576 
577         // Check Header Block
578         Assertions.assertEquals(1.0, file.getHeader().getFormatVersion(), 0.0);
579         Assertions.assertEquals(new AbsoluteDate(2012, 9, 12, 22, 31, 12,
580                                                  TimeScalesFactory.getUTC()), file.getHeader().getCreationDate());
581         Assertions.assertEquals("SDC", file.getHeader().getOriginator());
582         Assertions.assertEquals("GALAXY 15", file.getHeader().getMessageFor());
583         Assertions.assertEquals("20120912223112", file.getHeader().getMessageId());
584 
585         // OBJECT1
586         // Check Relative Metadata Block
587         Assertions.assertEquals(new AbsoluteDate(2012, 9, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 618, TimeOffset.MILLISECOND),
588                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getTca());
589         Assertions.assertEquals(104.92, file.getRelativeMetadata().getMissDistance(), DISTANCE_PRECISION);
590         Assertions.assertEquals(12093.52, file.getRelativeMetadata().getRelativeSpeed(), DERIVATION_PRECISION);
591         Assertions.assertEquals(30.6, file.getRelativeMetadata().getRelativePosition().getX(), DISTANCE_PRECISION);
592         Assertions.assertEquals(100.2, file.getRelativeMetadata().getRelativePosition().getY(), DISTANCE_PRECISION);
593         Assertions.assertEquals(5.7, file.getRelativeMetadata().getRelativePosition().getZ(), DISTANCE_PRECISION);
594         Assertions.assertEquals(-20.3, file.getRelativeMetadata().getRelativeVelocity().getX(), DERIVATION_PRECISION);
595         Assertions.assertEquals(-12000.0, file.getRelativeMetadata().getRelativeVelocity().getY(),
596                                 DERIVATION_PRECISION);
597         Assertions.assertEquals(-1500.9, file.getRelativeMetadata().getRelativeVelocity().getZ(), DERIVATION_PRECISION);
598         Assertions.assertEquals(new AbsoluteDate(2012, 9, 12, 18, 29, new TimeOffset(32, TimeOffset.SECOND, 212, TimeOffset.MILLISECOND),
599                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStartScreenPeriod());
600         Assertions.assertEquals(new AbsoluteDate(2012, 9, 15, 18, 29, new TimeOffset(32, TimeOffset.SECOND, 212, TimeOffset.MILLISECOND),
601                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStopScreenPeriod());
602         Assertions.assertEquals(ScreenVolumeFrame.RTN, file.getRelativeMetadata().getScreenVolumeFrame());
603         Assertions.assertEquals(ScreenVolumeShape.ELLIPSOID, file.getRelativeMetadata().getScreenVolumeShape());
604         Assertions.assertEquals(500, file.getRelativeMetadata().getScreenVolumeX(), 0);
605         Assertions.assertEquals(500, file.getRelativeMetadata().getScreenVolumeY(), 0);
606         Assertions.assertEquals(500, file.getRelativeMetadata().getScreenVolumeZ(), 0);
607         Assertions.assertEquals(new AbsoluteDate(2012, 9, 13, 20, 25, new TimeOffset(43, TimeOffset.SECOND, 222, TimeOffset.MILLISECOND),
608                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenEntryTime());
609         Assertions.assertEquals(new AbsoluteDate(2012, 9, 13, 23, 44, new TimeOffset(29, TimeOffset.SECOND, 324, TimeOffset.MILLISECOND),
610                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenExitTime());
611         Assertions.assertEquals(2.355e-03, file.getRelativeMetadata().getCollisionProbability(), 1e-30);
612         Assertions.assertEquals("ALFANO-2005", file.getRelativeMetadata().getCollisionProbaMethod().getName());
613         Assertions.assertEquals(PocMethodType.ALFANO_2005,
614                                 file.getRelativeMetadata().getCollisionProbaMethod().getType());
615 
616         // Check Metadata Block
617         Assertions.assertEquals("OBJECT1", file.getMetadataObject1().getObject());
618         Assertions.assertEquals("28884", file.getMetadataObject1().getObjectDesignator());
619         Assertions.assertEquals("SATCAT", file.getMetadataObject1().getCatalogName());
620         Assertions.assertEquals("GALAXY 15", file.getMetadataObject1().getObjectName());
621         Assertions.assertEquals("2005-041A", file.getMetadataObject1().getInternationalDes());
622         Assertions.assertEquals(ObjectType.PAYLOAD, file.getMetadataObject1().getObjectType());
623         Assertions.assertNull(file.getMetadataObject1().getOperatorContactPosition());
624         Assertions.assertEquals("INTELSAT", file.getMetadataObject1().getOperatorOrganization());
625         Assertions.assertEquals("GALAXY-15A-2012JAN-WMANEUVER23A", file.getMetadataObject1().getEphemName());
626         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject1().getCovarianceMethod());
627         Assertions.assertEquals(Maneuvrable.YES, file.getMetadataObject1().getManeuverable());
628         Assertions.assertEquals(CelestialBodyFrame.EME2000,
629                                 file.getMetadataObject1().getRefFrame().asCelestialBodyFrame());
630         Assertions.assertEquals("UTC", file.getMetadataObject1().getTimeSystem().name());
631 
632         // Check data block
633         // OD parameters block
634         Assertions.assertEquals(new AbsoluteDate(2012, 9, 6, 20, 25, new TimeOffset(43, TimeOffset.SECOND, 222, TimeOffset.MILLISECOND),
635                                                  TimeScalesFactory.getUTC()),
636                                 file.getDataObject1().getODParametersBlock().getTimeLastObsStart());
637         Assertions.assertEquals(new AbsoluteDate(2012, 9, 6, 20, 25, new TimeOffset(43, TimeOffset.SECOND, 222, TimeOffset.MILLISECOND),
638                                                  TimeScalesFactory.getUTC()),
639                                 file.getDataObject1().getODParametersBlock().getTimeLastObsEnd());
640         // State vector block
641         Assertions.assertEquals(-41600.46272465e3,
642                                 file.getDataObject1().getStateVectorBlock().getPositionVector().getX(), DISTANCE_PRECISION);
643         Assertions.assertEquals(3626.912120064e3,
644                                 file.getDataObject1().getStateVectorBlock().getPositionVector().getY(), DISTANCE_PRECISION);
645         Assertions.assertEquals(6039.06350924e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getZ(),
646                                 DISTANCE_PRECISION);
647         Assertions.assertEquals(-0.306132852503e3,
648                                 file.getDataObject1().getStateVectorBlock().getVelocityVector().getX(), DERIVATION_PRECISION);
649         Assertions.assertEquals(-3.044998353334e3,
650                                 file.getDataObject1().getStateVectorBlock().getVelocityVector().getY(), DERIVATION_PRECISION);
651         Assertions.assertEquals(-0.287674310725e3,
652                                 file.getDataObject1().getStateVectorBlock().getVelocityVector().getZ(), DERIVATION_PRECISION);
653         // Covariance Matrix block
654         Assertions.assertEquals(4.142e1, file.getDataObject1().getRTNCovarianceBlock().getCrr(),
655                                 COVARIANCE_DIAG_PRECISION);
656         Assertions.assertEquals(-8.579, file.getDataObject1().getRTNCovarianceBlock().getCtr(),
657                                 COVARIANCE_DIAG_PRECISION);
658         Assertions.assertEquals(2.533e3, file.getDataObject1().getRTNCovarianceBlock().getCtt(),
659                                 COVARIANCE_DIAG_PRECISION);
660         Assertions.assertEquals(-2.313e1, file.getDataObject1().getRTNCovarianceBlock().getCnr(),
661                                 COVARIANCE_DIAG_PRECISION);
662         Assertions.assertEquals(1.336e1, file.getDataObject1().getRTNCovarianceBlock().getCnt(),
663                                 COVARIANCE_DIAG_PRECISION);
664         Assertions.assertEquals(7.098e1, file.getDataObject1().getRTNCovarianceBlock().getCnn(),
665                                 COVARIANCE_DIAG_PRECISION);
666 
667         Assertions.assertEquals(2.520E-03, file.getDataObject1().getRTNCovarianceBlock().getCrdotr(),
668                                 COVARIANCE_PRECISION);
669         Assertions.assertEquals(-5.476E+00, file.getDataObject1().getRTNCovarianceBlock().getCrdott(),
670                                 COVARIANCE_PRECISION);
671         Assertions.assertEquals(8.626E-04, file.getDataObject1().getRTNCovarianceBlock().getCrdotn(),
672                                 COVARIANCE_PRECISION);
673         Assertions.assertEquals(5.744E-03, file.getDataObject1().getRTNCovarianceBlock().getCrdotrdot(),
674                                 COVARIANCE_PRECISION);
675 
676         Assertions.assertEquals(-1.006E-02, file.getDataObject1().getRTNCovarianceBlock().getCtdotr(),
677                                 COVARIANCE_PRECISION);
678         Assertions.assertEquals(4.041E-03, file.getDataObject1().getRTNCovarianceBlock().getCtdott(),
679                                 COVARIANCE_PRECISION);
680         Assertions.assertEquals(-1.359E-03, file.getDataObject1().getRTNCovarianceBlock().getCtdotn(),
681                                 COVARIANCE_PRECISION);
682         Assertions.assertEquals(-1.502E-05, file.getDataObject1().getRTNCovarianceBlock().getCtdotrdot(),
683                                 COVARIANCE_PRECISION);
684         Assertions.assertEquals(1.049E-05, file.getDataObject1().getRTNCovarianceBlock().getCtdottdot(),
685                                 COVARIANCE_PRECISION);
686 
687         Assertions.assertEquals(1.053E-03, file.getDataObject1().getRTNCovarianceBlock().getCndotr(),
688                                 COVARIANCE_PRECISION);
689         Assertions.assertEquals(-3.412E-03, file.getDataObject1().getRTNCovarianceBlock().getCndott(),
690                                 COVARIANCE_PRECISION);
691         Assertions.assertEquals(1.213E-02, file.getDataObject1().getRTNCovarianceBlock().getCndotn(),
692                                 COVARIANCE_PRECISION);
693         Assertions.assertEquals(-3.004E-06, file.getDataObject1().getRTNCovarianceBlock().getCndotrdot(),
694                                 COVARIANCE_PRECISION);
695         Assertions.assertEquals(-1.091E-06, file.getDataObject1().getRTNCovarianceBlock().getCndottdot(),
696                                 COVARIANCE_PRECISION);
697         Assertions.assertEquals(5.529E-05, file.getDataObject1().getRTNCovarianceBlock().getCndotndot(),
698                                 COVARIANCE_PRECISION);
699 
700         // OBJECT2
701         // Check Relative Metadata Block
702         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getScreenVolumeX(),
703                                 file.getRelativeMetadata().getScreenVolumeX(), DISTANCE_PRECISION);
704         Assertions.assertEquals(
705                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativePosition().getX(),
706                                 file.getRelativeMetadata().getRelativePosition().getX(), DISTANCE_PRECISION);
707         Assertions.assertEquals(
708                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativeVelocity().getZ(),
709                                 file.getRelativeMetadata().getRelativeVelocity().getZ(), DERIVATION_PRECISION);
710         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbability(),
711                                 file.getRelativeMetadata().getCollisionProbability(), 1e-30);
712         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbaMethod(),
713                                 file.getRelativeMetadata().getCollisionProbaMethod());
714 
715         // Check Metadata Block
716         Assertions.assertEquals("OBJECT2", file.getMetadataObject2().getObject());
717         Assertions.assertEquals("21139", file.getMetadataObject2().getObjectDesignator());
718         Assertions.assertEquals("SATCAT", file.getMetadataObject2().getCatalogName());
719         Assertions.assertEquals("ASTRA 1B", file.getMetadataObject2().getObjectName());
720         Assertions.assertEquals("1991-051A", file.getMetadataObject2().getInternationalDes());
721         Assertions.assertEquals(ObjectType.PAYLOAD, file.getMetadataObject2().getObjectType());
722         Assertions.assertEquals("NONE", file.getMetadataObject2().getEphemName());
723         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject2().getCovarianceMethod());
724         Assertions.assertEquals(Maneuvrable.YES, file.getMetadataObject2().getManeuverable());
725         Assertions.assertEquals(CelestialBodyFrame.EME2000,
726                                 file.getMetadataObject2().getRefFrame().asCelestialBodyFrame());
727         Assertions.assertEquals("UTC", file.getMetadataObject2().getTimeSystem().name());
728 
729         // Check data block
730         Assertions.assertEquals(-2956.02034826e3,
731                                 file.getDataObject2().getStateVectorBlock().getPositionVector().getX(), DISTANCE_PRECISION);
732         Assertions.assertEquals(-3.047096589536e3,
733                                 file.getDataObject2().getStateVectorBlock().getVelocityVector().getX(), DERIVATION_PRECISION);
734         // Covariance Matrix block
735         Assertions.assertEquals(1.337e3, file.getDataObject2().getRTNCovarianceBlock().getCrr(),
736                                 COVARIANCE_DIAG_PRECISION);
737         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(),
738                                 COVARIANCE_DIAG_PRECISION);
739 
740         Assertions.assertEquals(2.591e-3, file.getDataObject2().getRTNCovarianceBlock().getCrdotr(),
741                                 COVARIANCE_PRECISION);
742         Assertions.assertEquals(6.886e-5, file.getDataObject2().getRTNCovarianceBlock().getCrdotrdot(),
743                                 COVARIANCE_PRECISION);
744 
745         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getCtdott(),
746                                 COVARIANCE_PRECISION);
747         Assertions.assertEquals(1.059e-5, file.getDataObject2().getRTNCovarianceBlock().getCtdottdot(),
748                                 COVARIANCE_PRECISION);
749 
750         Assertions.assertEquals(8.633e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotn(),
751                                 COVARIANCE_PRECISION);
752         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getCndotrdot(),
753                                 COVARIANCE_PRECISION);
754 
755         // Verify comments
756         Assertions.assertEquals("[Relative Metadata/Data]",
757                                 file.getMetadataObject1().getRelativeMetadata().getComment().toString());
758         Assertions.assertEquals("[Object1 Metadata]", file.getMetadataObject1().getComments().toString());
759         Assertions.assertEquals("[Object2 Metadata]", file.getMetadataObject2().getComments().toString());
760         Assertions.assertEquals("[Object1 OD Parameters]",
761                                 file.getDataObject1().getODParametersBlock().getComments().toString());
762         Assertions.assertEquals("[Object1 Data]", file.getDataObject1().getComments().toString());
763         Assertions.assertEquals("[Object2 Data]", file.getDataObject2().getComments().toString());
764         Assertions.assertEquals("[Object2 OD Parameters]",
765                                 file.getDataObject2().getODParametersBlock().getComments().toString());
766         Assertions.assertEquals("[]", file.getDataObject1().getStateVectorBlock().getComments().toString());
767         Assertions.assertEquals("[Object1 Covariance in the RTN Coordinate Frame]",
768                                 file.getDataObject1().getRTNCovarianceBlock().getComments().toString());
769 
770     }
771 
772     @Test
773     public void testParseCDM4() {
774         /* Test for CdmExample2.txt, with only required data. */
775         // File
776         final String ex = "/ccsds/cdm/CDMExample4.txt";
777 
778         // Initialize the parser
779         final CdmParser parser = new ParserBuilder().buildCdmParser();
780 
781         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
782 
783         // Generated CDM file
784         final Cdm file = parser.parseMessage(source);
785 
786         Assertions.assertEquals(IERSConventions.IERS_2010, file.getConventions());
787         Assertions.assertEquals(DataContext.getDefault(), file.getDataContext());
788 
789         // Check Header Block
790         Assertions.assertEquals(1.0, file.getHeader().getFormatVersion(), 1.0e-10);
791         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12,
792                                                  TimeScalesFactory.getUTC()), file.getHeader().getCreationDate());
793         Assertions.assertEquals("JSPOC", file.getHeader().getOriginator());
794         Assertions.assertEquals("201113719185", file.getHeader().getMessageId());
795 
796         // OBJECT1
797         // Check Relative Metadata Block
798         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 618, TimeOffset.MILLISECOND),
799                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getTca());
800         Assertions.assertEquals(715.0, file.getRelativeMetadata().getMissDistance(), DISTANCE_PRECISION);
801 
802         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 18, 29, new TimeOffset(32, TimeOffset.SECOND, 212, TimeOffset.MILLISECOND),
803                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStartScreenPeriod());
804         Assertions.assertEquals(new AbsoluteDate(2010, 3, 15, 18, 29, new TimeOffset(32, TimeOffset.SECOND, 212, TimeOffset.MILLISECOND),
805                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStopScreenPeriod());
806         Assertions.assertEquals(ScreenVolumeFrame.RTN, file.getRelativeMetadata().getScreenVolumeFrame());
807         Assertions.assertEquals(ScreenVolumeShape.ELLIPSOID, file.getRelativeMetadata().getScreenVolumeShape());
808         Assertions.assertEquals(200, file.getRelativeMetadata().getScreenVolumeX(), 0);
809         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeY(), 0);
810         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeZ(), 0);
811         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 222, TimeOffset.MILLISECOND),
812                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenEntryTime());
813         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 824, TimeOffset.MILLISECOND),
814                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenExitTime());
815         Assertions.assertEquals(4.835E-05, file.getRelativeMetadata().getCollisionProbability(), 1e-30);
816         Assertions.assertEquals("FOSTER-1992", file.getRelativeMetadata().getCollisionProbaMethod().getName());
817         Assertions.assertEquals(PocMethodType.FOSTER_1992,
818                                 file.getRelativeMetadata().getCollisionProbaMethod().getType());
819 
820         // Check Metadata Block
821         Assertions.assertEquals("OBJECT1", file.getMetadataObject1().getObject());
822         Assertions.assertEquals(ObjectType.PAYLOAD, file.getMetadataObject1().getObjectType());
823         Assertions.assertEquals("OSA", file.getMetadataObject1().getOperatorContactPosition());
824         Assertions.assertEquals("EUMETSAT", file.getMetadataObject1().getOperatorOrganization());
825 
826         // Covariance Matrix block
827         Assertions.assertEquals(4.142e1, file.getDataObject1().getRTNCovarianceBlock().getCrr(),
828                                 COVARIANCE_DIAG_PRECISION);
829         Assertions.assertEquals(-8.579, file.getDataObject1().getRTNCovarianceBlock().getCtr(),
830                                 COVARIANCE_DIAG_PRECISION);
831         Assertions.assertEquals(2.533e3, file.getDataObject1().getRTNCovarianceBlock().getCtt(),
832                                 COVARIANCE_DIAG_PRECISION);
833         Assertions.assertEquals(-2.313e1, file.getDataObject1().getRTNCovarianceBlock().getCnr(),
834                                 COVARIANCE_DIAG_PRECISION);
835         Assertions.assertEquals(1.336e1, file.getDataObject1().getRTNCovarianceBlock().getCnt(),
836                                 COVARIANCE_DIAG_PRECISION);
837         Assertions.assertEquals(7.098e1, file.getDataObject1().getRTNCovarianceBlock().getCnn(),
838                                 COVARIANCE_DIAG_PRECISION);
839 
840         Assertions.assertEquals(-1.862E+00, file.getDataObject1().getRTNCovarianceBlock().getCdrgr(),
841                                 COVARIANCE_DIAG_PRECISION);
842         Assertions.assertEquals(3.530E+00, file.getDataObject1().getRTNCovarianceBlock().getCdrgt(),
843                                 COVARIANCE_DIAG_PRECISION);
844         Assertions.assertEquals(-3.100E-01, file.getDataObject1().getRTNCovarianceBlock().getCdrgn(),
845                                 COVARIANCE_DIAG_PRECISION);
846         Assertions.assertEquals(-1.214E-04, file.getDataObject1().getRTNCovarianceBlock().getCdrgrdot(),
847                                 COVARIANCE_DIAG_PRECISION);
848         Assertions.assertEquals(2.580E-04, file.getDataObject1().getRTNCovarianceBlock().getCdrgtdot(),
849                                 COVARIANCE_DIAG_PRECISION);
850         Assertions.assertEquals(-6.467E-05, file.getDataObject1().getRTNCovarianceBlock().getCdrgndot(),
851                                 COVARIANCE_DIAG_PRECISION);
852         Assertions.assertEquals(3.483E-06, file.getDataObject1().getRTNCovarianceBlock().getCdrgdrg(),
853                                 COVARIANCE_DIAG_PRECISION);
854 
855         Assertions.assertEquals(-1.492E+02, file.getDataObject1().getRTNCovarianceBlock().getCsrpr(),
856                                 COVARIANCE_DIAG_PRECISION);
857         Assertions.assertEquals(2.044E+02, file.getDataObject1().getRTNCovarianceBlock().getCsrpt(),
858                                 COVARIANCE_DIAG_PRECISION);
859         Assertions.assertEquals(-2.331E+01, file.getDataObject1().getRTNCovarianceBlock().getCsrpn(),
860                                 COVARIANCE_DIAG_PRECISION);
861         Assertions.assertEquals(-1.254E-03, file.getDataObject1().getRTNCovarianceBlock().getCsrprdot(),
862                                 COVARIANCE_DIAG_PRECISION);
863         Assertions.assertEquals(2.013E-02, file.getDataObject1().getRTNCovarianceBlock().getCsrptdot(),
864                                 COVARIANCE_DIAG_PRECISION);
865         Assertions.assertEquals(-4.700E-03, file.getDataObject1().getRTNCovarianceBlock().getCsrpndot(),
866                                 COVARIANCE_DIAG_PRECISION);
867         Assertions.assertEquals(2.210E-04, file.getDataObject1().getRTNCovarianceBlock().getCsrpdrg(),
868                                 COVARIANCE_DIAG_PRECISION);
869         Assertions.assertEquals(1.593E-02, file.getDataObject1().getRTNCovarianceBlock().getCsrpsrp(),
870                                 COVARIANCE_DIAG_PRECISION);
871 
872         Assertions.assertEquals(-1.803E-06, file.getDataObject1().getRTNCovarianceBlock().getCthrr(),
873                                 COVARIANCE_PRECISION);
874         Assertions.assertEquals(3.803E-03, file.getDataObject1().getRTNCovarianceBlock().getCthrt(),
875                                 COVARIANCE_PRECISION);
876         Assertions.assertEquals(3.303E02, file.getDataObject1().getRTNCovarianceBlock().getCthrn(),
877                                 COVARIANCE_PRECISION);
878         Assertions.assertEquals(7.203E01, file.getDataObject1().getRTNCovarianceBlock().getCthrrdot(),
879                                 COVARIANCE_PRECISION);
880         Assertions.assertEquals(-1.654E01, file.getDataObject1().getRTNCovarianceBlock().getCthrtdot(),
881                                 COVARIANCE_PRECISION);
882         Assertions.assertEquals(9.203E-01, file.getDataObject1().getRTNCovarianceBlock().getCthrndot(),
883                                 COVARIANCE_PRECISION);
884         Assertions.assertEquals(-3.876, file.getDataObject1().getRTNCovarianceBlock().getCthrdrg(),
885                                 COVARIANCE_PRECISION);
886         Assertions.assertEquals(6.876E03, file.getDataObject1().getRTNCovarianceBlock().getCthrsrp(),
887                                 COVARIANCE_PRECISION);
888         Assertions.assertEquals(-2.986E-02, file.getDataObject1().getRTNCovarianceBlock().getCthrthr(),
889                                 COVARIANCE_PRECISION);
890 
891         // OBJECT2
892         // Check Relative Metadata Block
893         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getScreenVolumeX(),
894                                 file.getRelativeMetadata().getScreenVolumeX(), DISTANCE_PRECISION);
895         Assertions.assertEquals(
896                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativePosition().getY(),
897                                 file.getRelativeMetadata().getRelativePosition().getY(), DISTANCE_PRECISION);
898         Assertions.assertEquals(
899                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativeVelocity().getZ(),
900                                 file.getRelativeMetadata().getRelativeVelocity().getZ(), DERIVATION_PRECISION);
901         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbability(),
902                                 file.getRelativeMetadata().getCollisionProbability(), 1e-30);
903         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbaMethod(),
904                                 file.getRelativeMetadata().getCollisionProbaMethod());
905 
906         // Check Metadata Block
907         Assertions.assertEquals("OBJECT2", file.getMetadataObject2().getObject());
908         Assertions.assertEquals("30337", file.getMetadataObject2().getObjectDesignator());
909         Assertions.assertEquals("SATCAT", file.getMetadataObject2().getCatalogName());
910         Assertions.assertEquals("FENGYUN 1C DEB", file.getMetadataObject2().getObjectName());
911         Assertions.assertEquals("1999-025AA", file.getMetadataObject2().getInternationalDes());
912         Assertions.assertEquals("NONE", file.getMetadataObject2().getEphemName());
913         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject2().getCovarianceMethod());
914         Assertions.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
915         Assertions.assertEquals(CelestialBodyFrame.EME2000,
916                                 file.getMetadataObject2().getRefFrame().asCelestialBodyFrame());
917         Assertions.assertEquals("UTC", file.getMetadataObject2().getTimeSystem().name());
918 
919         // Check data block
920         Assertions.assertEquals(2569.540800e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getX(),
921                                 DISTANCE_PRECISION);
922         Assertions.assertEquals(-2.888612500e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getX(),
923                                 DERIVATION_PRECISION);
924         // Covariance Matrix block
925         Assertions.assertEquals(1.337e3, file.getDataObject2().getRTNCovarianceBlock().getCrr(),
926                                 COVARIANCE_DIAG_PRECISION);
927         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(),
928                                 COVARIANCE_DIAG_PRECISION);
929 
930         Assertions.assertEquals(2.591e-3, file.getDataObject2().getRTNCovarianceBlock().getCrdotr(),
931                                 COVARIANCE_PRECISION);
932         Assertions.assertEquals(6.886e-5, file.getDataObject2().getRTNCovarianceBlock().getCrdotrdot(),
933                                 COVARIANCE_PRECISION);
934 
935         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getCtdott(),
936                                 COVARIANCE_PRECISION);
937         Assertions.assertEquals(1.059e-5, file.getDataObject2().getRTNCovarianceBlock().getCtdottdot(),
938                                 COVARIANCE_PRECISION);
939 
940         Assertions.assertEquals(8.633e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotn(),
941                                 COVARIANCE_PRECISION);
942         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getCndotrdot(),
943                                 COVARIANCE_PRECISION);
944 
945         Assertions.assertEquals(-5.117E-01, file.getDataObject2().getRTNCovarianceBlock().getCdrgr(),
946                                 COVARIANCE_PRECISION);
947         Assertions.assertEquals(1.319E+00, file.getDataObject2().getRTNCovarianceBlock().getCdrgt(),
948                                 COVARIANCE_PRECISION);
949         Assertions.assertEquals(-1.903E-05, file.getDataObject2().getRTNCovarianceBlock().getCdrgndot(),
950                                 COVARIANCE_PRECISION);
951         Assertions.assertEquals(7.402E-05, file.getDataObject2().getRTNCovarianceBlock().getCdrgtdot(),
952                                 COVARIANCE_PRECISION);
953         Assertions.assertEquals(-3.297E+01, file.getDataObject2().getRTNCovarianceBlock().getCsrpr(),
954                                 COVARIANCE_PRECISION);
955         Assertions.assertEquals(8.164E+01, file.getDataObject2().getRTNCovarianceBlock().getCsrpt(),
956                                 COVARIANCE_PRECISION);
957 
958         // Verify comments
959         Assertions.assertEquals("[Relative Metadata/Data]", file.getRelativeMetadata().getComment().toString());
960         Assertions.assertEquals("[Object1 Metadata]", file.getMetadataObject1().getComments().toString());
961         Assertions.assertEquals("[Object2 Metadata]", file.getMetadataObject2().getComments().toString());
962         Assertions.assertEquals("[Object1 Data]", file.getDataObject1().getComments().toString());
963         Assertions.assertEquals("[Object1 OD Parameters]",
964                                 file.getDataObject1().getODParametersBlock().getComments().toString());
965         Assertions.assertEquals("[Object2 OD Parameters]",
966                                 file.getDataObject2().getODParametersBlock().getComments().toString());
967         Assertions.assertEquals(
968                                 "[Object1 Additional Parameters, Apogee Altitude=779 km, Perigee Altitude=765 km, Inclination=86.4 deg]",
969                                 file.getDataObject1().getAdditionalParametersBlock().getComments().toString());
970         Assertions.assertEquals(
971                                 "[Object2 Additional Parameters, Apogee Altitude=786 km, Perigee Altitude=414 km, Inclination=98.9 deg]",
972                                 file.getDataObject2().getAdditionalParametersBlock().getComments().toString());
973 
974     }
975 
976 
977     @Test
978     public void testParseXML_CDM1() {
979         /* Test for CdmExample1.xml, with only required data. */
980         // File
981         final String ex = "/ccsds/cdm/CDMExample1.xml";
982 
983         // Initialize the parser
984         final CdmParser parser = new ParserBuilder().buildCdmParser();
985 
986         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
987 
988         // Generated CDM file
989         final Cdm file = parser.parseMessage(source);
990 
991         Assertions.assertEquals(IERSConventions.IERS_2010, file.getConventions());
992         Assertions.assertEquals(DataContext.getDefault(), file.getDataContext());
993 
994         // Check Header Block
995         Assertions.assertEquals(1.0, file.getHeader().getFormatVersion(), 0.0);
996         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12.000,
997                                                  TimeScalesFactory.getUTC()), file.getHeader().getCreationDate());
998         Assertions.assertEquals("JSPOC", file.getHeader().getOriginator());
999         Assertions.assertEquals("SATELLITE A", file.getHeader().getMessageFor());
1000         Assertions.assertEquals("20111371985", file.getHeader().getMessageId());
1001 
1002         // OBJECT1
1003         // Check Relative Metadata Block
1004         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND,
1005                                                                                      618, TimeOffset.MILLISECOND),
1006                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getTca());
1007         Assertions.assertEquals(715.0, file.getRelativeMetadata().getMissDistance(), DISTANCE_PRECISION);
1008         Assertions.assertEquals(14762.0, file.getRelativeMetadata().getRelativeSpeed(), DERIVATION_PRECISION);
1009         Assertions.assertEquals(27.4, file.getRelativeMetadata().getRelativePosition().getX(), DISTANCE_PRECISION);
1010         Assertions.assertEquals(-70.2, file.getRelativeMetadata().getRelativePosition().getY(), DISTANCE_PRECISION);
1011         Assertions.assertEquals(711.8, file.getRelativeMetadata().getRelativePosition().getZ(), DISTANCE_PRECISION);
1012         Assertions.assertEquals(-7.2, file.getRelativeMetadata().getRelativeVelocity().getX(), DERIVATION_PRECISION);
1013         Assertions.assertEquals(-14692.0, file.getRelativeMetadata().getRelativeVelocity().getY(),
1014                                 DERIVATION_PRECISION);
1015         Assertions.assertEquals(-1437.2, file.getRelativeMetadata().getRelativeVelocity().getZ(),
1016                                 DERIVATION_PRECISION);
1017         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 18, 29, new TimeOffset(32, TimeOffset.SECOND,
1018                                                                                      212, TimeOffset.MILLISECOND),
1019                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStartScreenPeriod());
1020         Assertions.assertEquals(new AbsoluteDate(2010, 3, 15, 18, 29, new TimeOffset(32, TimeOffset.SECOND,
1021                                                                                      212, TimeOffset.MILLISECOND),
1022                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getStopScreenPeriod());
1023         Assertions.assertEquals(ScreenVolumeFrame.RTN, file.getRelativeMetadata().getScreenVolumeFrame());
1024         Assertions.assertEquals(ScreenVolumeShape.ELLIPSOID, file.getRelativeMetadata().getScreenVolumeShape());
1025         Assertions.assertEquals(200, file.getRelativeMetadata().getScreenVolumeX(), 0);
1026         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeY(), 0);
1027         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeZ(), 0);
1028         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 20, 25, new TimeOffset(43, TimeOffset.SECOND,
1029                                                                                      222, TimeOffset.MILLISECOND),
1030                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenEntryTime());
1031         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 23, 44, new TimeOffset(29, TimeOffset.SECOND,
1032                                                                                      324, TimeOffset.MILLISECOND),
1033                                                  TimeScalesFactory.getUTC()), file.getRelativeMetadata().getScreenExitTime());
1034         Assertions.assertEquals(4.835E-05, file.getRelativeMetadata().getCollisionProbability(), 1e-30);
1035         Assertions.assertEquals("FOSTER-1992", file.getRelativeMetadata().getCollisionProbaMethod().getName());
1036         Assertions.assertEquals(PocMethodType.FOSTER_1992,
1037                                 file.getRelativeMetadata().getCollisionProbaMethod().getType());
1038 
1039         // Check Metadata Block
1040         Assertions.assertEquals("OBJECT1", file.getMetadataObject1().getObject());
1041         Assertions.assertEquals("12345", file.getMetadataObject1().getObjectDesignator());
1042         Assertions.assertEquals("SATCAT", file.getMetadataObject1().getCatalogName());
1043         Assertions.assertEquals("SATELLITE A", file.getMetadataObject1().getObjectName());
1044         Assertions.assertEquals("1997-030E", file.getMetadataObject1().getInternationalDes());
1045         Assertions.assertEquals("EPHEMERIS SATELLITE A", file.getMetadataObject1().getEphemName());
1046         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject1().getCovarianceMethod());
1047         Assertions.assertEquals(Maneuvrable.YES, file.getMetadataObject1().getManeuverable());
1048         Assertions.assertEquals(CelestialBodyFrame.EME2000,
1049                                 file.getMetadataObject1().getRefFrame().asCelestialBodyFrame());
1050         Assertions.assertEquals("UTC", file.getMetadataObject1().getTimeSystem().name());
1051 
1052 
1053         // Check data block
1054         // State vector block
1055         Assertions.assertEquals(2570.097065e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getX(),
1056                                 DISTANCE_PRECISION);
1057         Assertions.assertEquals(2244.654904e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getY(),
1058                                 DISTANCE_PRECISION);
1059         Assertions.assertEquals(6281.497978e3, file.getDataObject1().getStateVectorBlock().getPositionVector().getZ(),
1060                                 DISTANCE_PRECISION);
1061         Assertions.assertEquals(4.418769571e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getX(),
1062                                 DERIVATION_PRECISION);
1063         Assertions.assertEquals(4.833547743e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getY(),
1064                                 DERIVATION_PRECISION);
1065         Assertions.assertEquals(-3.526774282e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getZ(),
1066                                 DERIVATION_PRECISION);
1067         // Covariance Matrix block
1068         Assertions.assertEquals(4.142e1, file.getDataObject1().getRTNCovarianceBlock().getCrr(),
1069                                 COVARIANCE_DIAG_PRECISION);
1070         Assertions.assertEquals(-8.579, file.getDataObject1().getRTNCovarianceBlock().getCtr(),
1071                                 COVARIANCE_DIAG_PRECISION);
1072         Assertions.assertEquals(2.533e3, file.getDataObject1().getRTNCovarianceBlock().getCtt(),
1073                                 COVARIANCE_DIAG_PRECISION);
1074         Assertions.assertEquals(-2.313e1, file.getDataObject1().getRTNCovarianceBlock().getCnr(),
1075                                 COVARIANCE_DIAG_PRECISION);
1076         Assertions.assertEquals(1.336e1, file.getDataObject1().getRTNCovarianceBlock().getCnt(),
1077                                 COVARIANCE_DIAG_PRECISION);
1078         Assertions.assertEquals(7.098e1, file.getDataObject1().getRTNCovarianceBlock().getCnn(),
1079                                 COVARIANCE_DIAG_PRECISION);
1080 
1081         Assertions.assertEquals(2.520e-3, file.getDataObject1().getRTNCovarianceBlock().getCrdotr(),
1082                                 COVARIANCE_PRECISION);
1083         Assertions.assertEquals(-5.476, file.getDataObject1().getRTNCovarianceBlock().getCrdott(),
1084                                 COVARIANCE_PRECISION);
1085         Assertions.assertEquals(8.626e-4, file.getDataObject1().getRTNCovarianceBlock().getCrdotn(),
1086                                 COVARIANCE_PRECISION);
1087         Assertions.assertEquals(5.744e-3, file.getDataObject1().getRTNCovarianceBlock().getCrdotrdot(),
1088                                 COVARIANCE_PRECISION);
1089 
1090         Assertions.assertEquals(-1.006e-2, file.getDataObject1().getRTNCovarianceBlock().getCtdotr(),
1091                                 COVARIANCE_PRECISION);
1092         Assertions.assertEquals(4.041e-3, file.getDataObject1().getRTNCovarianceBlock().getCtdott(),
1093                                 COVARIANCE_PRECISION);
1094         Assertions.assertEquals(-1.359e-3, file.getDataObject1().getRTNCovarianceBlock().getCtdotn(),
1095                                 COVARIANCE_PRECISION);
1096         Assertions.assertEquals(-1.502e-5, file.getDataObject1().getRTNCovarianceBlock().getCtdotrdot(),
1097                                 COVARIANCE_PRECISION);
1098         Assertions.assertEquals(1.049e-5, file.getDataObject1().getRTNCovarianceBlock().getCtdottdot(),
1099                                 COVARIANCE_PRECISION);
1100 
1101         Assertions.assertEquals(1.053e-3, file.getDataObject1().getRTNCovarianceBlock().getCndotr(),
1102                                 COVARIANCE_PRECISION);
1103         Assertions.assertEquals(-3.412e-3, file.getDataObject1().getRTNCovarianceBlock().getCndott(),
1104                                 COVARIANCE_PRECISION);
1105         Assertions.assertEquals(1.213e-2, file.getDataObject1().getRTNCovarianceBlock().getCndotn(),
1106                                 COVARIANCE_PRECISION);
1107         Assertions.assertEquals(-3.004e-6, file.getDataObject1().getRTNCovarianceBlock().getCndotrdot(),
1108                                 COVARIANCE_PRECISION);
1109         Assertions.assertEquals(-1.091e-6, file.getDataObject1().getRTNCovarianceBlock().getCndottdot(),
1110                                 COVARIANCE_PRECISION);
1111         Assertions.assertEquals(5.529e-5, file.getDataObject1().getRTNCovarianceBlock().getCndotndot(),
1112                                 COVARIANCE_PRECISION);
1113 
1114         // OBJECT2
1115         // Check Relative Metadata Block
1116         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getScreenVolumeX(),
1117                                 file.getRelativeMetadata().getScreenVolumeX(), DISTANCE_PRECISION);
1118         Assertions.assertEquals(
1119                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativePosition().getZ(),
1120                                 file.getRelativeMetadata().getRelativePosition().getZ(), DISTANCE_PRECISION);
1121         Assertions.assertEquals(
1122                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getRelativeVelocity().getZ(),
1123                                 file.getRelativeMetadata().getRelativeVelocity().getZ(), DERIVATION_PRECISION);
1124         Assertions.assertEquals(
1125                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbability(),
1126                                 file.getRelativeMetadata().getCollisionProbability(), 1e-30);
1127         Assertions.assertEquals(
1128                                 file.getSegments().get(1).getMetadata().getRelativeMetadata().getCollisionProbaMethod(),
1129                                 file.getRelativeMetadata().getCollisionProbaMethod());
1130 
1131         // Check Metadata Block
1132         Assertions.assertEquals("OBJECT2", file.getMetadataObject2().getObject());
1133         Assertions.assertEquals("30337", file.getMetadataObject2().getObjectDesignator());
1134         Assertions.assertEquals("SATCAT", file.getMetadataObject2().getCatalogName());
1135         Assertions.assertEquals("FENGYUN 1C DEB", file.getMetadataObject2().getObjectName());
1136         Assertions.assertEquals("1999-025AA", file.getMetadataObject2().getInternationalDes());
1137         Assertions.assertEquals("NONE", file.getMetadataObject2().getEphemName());
1138         Assertions.assertEquals(CovarianceMethod.CALCULATED, file.getMetadataObject2().getCovarianceMethod());
1139         Assertions.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
1140         Assertions.assertEquals(CelestialBodyFrame.EME2000,
1141                                 file.getMetadataObject2().getRefFrame().asCelestialBodyFrame());
1142         Assertions.assertEquals("UTC", file.getMetadataObject2().getTimeSystem().name());
1143 
1144         // Check data block
1145         Assertions.assertEquals(2569.540800e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getX(),
1146                                 DISTANCE_PRECISION);
1147         Assertions.assertEquals(2245.093614e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getY(),
1148                                 DISTANCE_PRECISION);
1149         Assertions.assertEquals(6281.599946e3, file.getDataObject2().getStateVectorBlock().getPositionVector().getZ(),
1150                                 DISTANCE_PRECISION);
1151         Assertions.assertEquals(-2.888612500e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getX(),
1152                                 DERIVATION_PRECISION);
1153         Assertions.assertEquals(-6.007247516e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getY(),
1154                                 DERIVATION_PRECISION);
1155         Assertions.assertEquals(3.328770172e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getZ(),
1156                                 DERIVATION_PRECISION);
1157         // Covariance Matrix block
1158         Assertions.assertEquals(1.337e3, file.getDataObject2().getRTNCovarianceBlock().getCrr(),
1159                                 COVARIANCE_DIAG_PRECISION);
1160         Assertions.assertEquals(-4.806e4, file.getDataObject2().getRTNCovarianceBlock().getCtr(),
1161                                 COVARIANCE_DIAG_PRECISION);
1162         Assertions.assertEquals(2.492e6, file.getDataObject2().getRTNCovarianceBlock().getCtt(),
1163                                 COVARIANCE_DIAG_PRECISION);
1164         Assertions.assertEquals(-3.298e1, file.getDataObject2().getRTNCovarianceBlock().getCnr(),
1165                                 COVARIANCE_DIAG_PRECISION);
1166         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(),
1167                                 COVARIANCE_DIAG_PRECISION);
1168         Assertions.assertEquals(7.105e1, file.getDataObject2().getRTNCovarianceBlock().getCnn(),
1169                                 COVARIANCE_DIAG_PRECISION);
1170 
1171         Assertions.assertEquals(2.591e-3, file.getDataObject2().getRTNCovarianceBlock().getCrdotr(),
1172                                 COVARIANCE_PRECISION);
1173         Assertions.assertEquals(-4.152e-2, file.getDataObject2().getRTNCovarianceBlock().getCrdott(),
1174                                 COVARIANCE_PRECISION);
1175         Assertions.assertEquals(-1.784e-6, file.getDataObject2().getRTNCovarianceBlock().getCrdotn(),
1176                                 COVARIANCE_PRECISION);
1177         Assertions.assertEquals(6.886e-5, file.getDataObject2().getRTNCovarianceBlock().getCrdotrdot(),
1178                                 COVARIANCE_PRECISION);
1179 
1180         Assertions.assertEquals(-1.016e-2, file.getDataObject2().getRTNCovarianceBlock().getCtdotr(),
1181                                 COVARIANCE_PRECISION);
1182         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getCtdott(),
1183                                 COVARIANCE_PRECISION);
1184         Assertions.assertEquals(1.637e-3, file.getDataObject2().getRTNCovarianceBlock().getCtdotn(),
1185                                 COVARIANCE_PRECISION);
1186         Assertions.assertEquals(-2.987e-6, file.getDataObject2().getRTNCovarianceBlock().getCtdotrdot(),
1187                                 COVARIANCE_PRECISION);
1188         Assertions.assertEquals(1.059e-5, file.getDataObject2().getRTNCovarianceBlock().getCtdottdot(),
1189                                 COVARIANCE_PRECISION);
1190 
1191         Assertions.assertEquals(4.400e-3, file.getDataObject2().getRTNCovarianceBlock().getCndotr(),
1192                                 COVARIANCE_PRECISION);
1193         Assertions.assertEquals(8.482e-3, file.getDataObject2().getRTNCovarianceBlock().getCndott(),
1194                                 COVARIANCE_PRECISION);
1195         Assertions.assertEquals(8.633e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotn(),
1196                                 COVARIANCE_PRECISION);
1197         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getCndotrdot(),
1198                                 COVARIANCE_PRECISION);
1199         Assertions.assertEquals(-4.594e-6, file.getDataObject2().getRTNCovarianceBlock().getCndottdot(),
1200                                 COVARIANCE_PRECISION);
1201         Assertions.assertEquals(5.178e-5, file.getDataObject2().getRTNCovarianceBlock().getCndotndot(),
1202                                 COVARIANCE_PRECISION);
1203 
1204         // Check relative metadata comments for Object1
1205         ArrayList<String> relativeMetadataComment = new ArrayList<>();
1206         relativeMetadataComment.add("Relative Metadata/Data");
1207         Assertions.assertEquals(relativeMetadataComment, file.getRelativeMetadata().getComment());
1208 
1209         // Check metadata comments for Object1
1210         ArrayList<String> MetadataComment = new ArrayList<>();
1211         MetadataComment.add("Object1 Metadata");
1212         Assertions.assertEquals(MetadataComment, file.getMetadataObject1().getComments());
1213 
1214         // Check data general comments and OD parameters comments for Object1
1215         ArrayList<String> generalComment = new ArrayList<>();
1216         generalComment.add("Object1 Data");
1217         Assertions.assertEquals(generalComment, file.getDataObject1().getComments());
1218 
1219         // Check additional parameters comments Object1
1220         ArrayList<String> addParametersComment = new ArrayList<>();
1221         addParametersComment.add("Object 1 Additional Parameters");
1222         Assertions.assertEquals(addParametersComment,
1223                                 file.getDataObject1().getAdditionalParametersBlock().getComments());
1224 
1225         // Check state vector comments Object1
1226         ArrayList<String> stateVectorComment = new ArrayList<>();
1227         stateVectorComment.add("Object1 State Vector");
1228         Assertions.assertEquals(stateVectorComment, file.getDataObject1().getStateVectorBlock().getComments());
1229 
1230         // Check RTN covariance comments Object1
1231         ArrayList<String> RTNComment = new ArrayList<>();
1232         RTNComment.add("Object1 Covariance in the RTN Coordinate Frame");
1233         Assertions.assertEquals(RTNComment, file.getDataObject1().getRTNCovarianceBlock().getComments());
1234 
1235 
1236         // Check general comments Object2
1237         ArrayList<String> generalCommentObj2AddParam = new ArrayList<>();
1238         generalCommentObj2AddParam.add("Object2 Additional Parameters");
1239         generalCommentObj2AddParam.add("Apogee Altitude=768 km, Perigee Altitude=414 km, Inclination=98.8 deg");
1240         Assertions.assertEquals(generalCommentObj2AddParam.toString(),
1241                                 file.getDataObject2().getAdditionalParametersBlock().getComments().toString());
1242 
1243     }
1244 
1245     @Test
1246     public void testNonExistentFile() throws URISyntaxException {
1247         final String realName = getClass().getResource("/ccsds/cdm/CDMExample1.txt").toURI().getPath();
1248         final String wrongName = realName + "xxxxx";
1249         try {
1250             final DataSource source = new DataSource(wrongName, () -> getClass().getResourceAsStream(wrongName));
1251             new ParserBuilder().
1252             buildCdmParser().
1253             parseMessage(source);
1254             Assertions.fail("an exception should have been thrown");
1255         } catch (OrekitException oe) {
1256             Assertions.assertEquals(OrekitMessages.UNABLE_TO_FIND_FILE, oe.getSpecifier());
1257             Assertions.assertEquals(wrongName, oe.getParts()[0]);
1258         }
1259     }
1260 
1261     @Test
1262     public void testMissingTCA() {
1263         final String name = "/ccsds/cdm/CDM-missing-TCA.txt";
1264         try {
1265             final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
1266             new ParserBuilder().
1267             buildCdmParser().
1268             parseMessage(source);
1269             Assertions.fail("an exception should have been thrown");
1270         } catch (OrekitException oe) {
1271             Assertions.assertEquals(OrekitMessages.UNINITIALIZED_VALUE_FOR_KEY, oe.getSpecifier());
1272             Assertions.assertEquals("TCA", oe.getParts()[0]);
1273         }
1274     }
1275 
1276     @Test
1277     public void testMissingObj2StateVectorX() {
1278         final String name = "/ccsds/cdm/CDM-missing-object2-state-vector.txt";
1279         try {
1280             final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
1281             new ParserBuilder().
1282             buildCdmParser().
1283             parseMessage(source);
1284             Assertions.fail("an exception should have been thrown");
1285         } catch (OrekitException oe) {
1286             Assertions.assertEquals(OrekitMessages.UNINITIALIZED_VALUE_FOR_KEY, oe.getSpecifier());
1287             Assertions.assertEquals("X", oe.getParts()[0]);
1288         }
1289     }
1290 
1291     @Test
1292     public void testMissingObj1CovarianceCNDOT_NDOT() {
1293         final String name = "/ccsds/cdm/CDM-missing-object1-covariance-block.xml";
1294         try {
1295             final DataSource source = new DataSource(name, () -> getClass().getResourceAsStream(name));
1296             new ParserBuilder().
1297             buildCdmParser().
1298             parseMessage(source);
1299             Assertions.fail("an exception should have been thrown");
1300         } catch (OrekitException oe) {
1301             Assertions.assertEquals(OrekitMessages.UNINITIALIZED_VALUE_FOR_KEY, oe.getSpecifier());
1302             Assertions.assertEquals("CR_R", oe.getParts()[0]);
1303         }
1304     }
1305 
1306     /** Test that the Earth is returned by default when no orbit center were explicitly defined. */
1307     @Test
1308     public void testMissingObj1OrbitCenterGetFrame() {
1309 
1310         // GIVEN
1311         final String ex = "/ccsds/cdm/CDM-no-orbit-center-defined-obj1.txt";
1312 
1313         // Initialize the parser
1314         final CdmParser parser = new ParserBuilder().buildCdmParser();
1315 
1316         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1317 
1318         // WHEN
1319         // Generated CDM file
1320         final Cdm file = parser.parseMessage(source);
1321 
1322         // WHEN
1323         final BodyFacade obj1OrbitCenter     = file.getMetadataObject1().getOrbitCenter();
1324         final BodyFacade expectedOrbitCenter = new BodyFacade(CelestialBodyFactory.EARTH.toUpperCase(),
1325                                                               CelestialBodyFactory.getEarth());
1326 
1327         Assertions.assertEquals(expectedOrbitCenter.getName(), obj1OrbitCenter.getName());
1328         Assertions.assertEquals(expectedOrbitCenter.getBody(), obj1OrbitCenter.getBody());
1329 
1330     }
1331 
1332     @Test
1333     public void testCovarianceNumberFormatErrorType() {
1334         final String ex = "/ccsds/cdm/CDM-covariance-wrong-entry-format.txt";
1335         try {
1336             final DataSource source =  new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1337             new ParserBuilder().
1338             buildCdmParser().
1339             parseMessage(source);
1340         } catch (OrekitException oe) {
1341             Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_ELEMENT_IN_FILE, oe.getSpecifier());
1342             Assertions.assertEquals("CRDOT_T", oe.getParts()[0]);
1343             Assertions.assertEquals(65, oe.getParts()[1]);
1344         }
1345     }
1346 
1347     @Test
1348     public void test_issue_940() {
1349 
1350         // Files
1351         final String cdm_kvn = "/ccsds/cdm/CDMExample_issue_940.txt";
1352         final String cdm_xml = "/ccsds/cdm/CDMExample_issue_940.xml";
1353 
1354 
1355         test_issue_940_data(cdm_kvn);
1356         test_issue_940_data(cdm_xml);
1357 
1358     }
1359 
1360     public void test_issue_940_data(String ex) {
1361 
1362         // Initialize the parser
1363         final CdmParser parser = new ParserBuilder().buildCdmParser();
1364 
1365         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1366 
1367         // Generated CDM file
1368         final Cdm file = parser.parseMessage(source);
1369 
1370 
1371 
1372         // Tests additional CDM Header keys
1373 
1374 
1375 
1376         // Check CLASSIFICATION is correctly read
1377         Assertions.assertEquals("\"Free text - for examples see CDM pink book (CCSDS 508.0-P-1.0.2)\"", 
1378                                 file.getHeader().getClassification(),"CLASSIFICATION");
1379 
1380 
1381 
1382         // Test additional CDM Relative Metadata Keys
1383 
1384 
1385 
1386         // Check CONJUNCTION_ID is correctly read
1387         Assertions.assertEquals("20220708T10hz SATELLITEA SATELLITEB", file.getRelativeMetadata().getConjunctionId(), "CONJUNCTION ID");
1388 
1389         // Check APPROACH_ANGLE is correctly read
1390         Assertions.assertEquals(180.0, FastMath.toDegrees(file.getRelativeMetadata().getApproachAngle()), 0.0);
1391 
1392         // Check SCREEN_TYPE is correctly read
1393         Assertions.assertEquals(ScreenType.SHAPE, file.getRelativeMetadata().getScreenType(), "SCREEN_TYPE");
1394 
1395         // Check SCREEN_VOLUME_SHAPE is correctly read
1396         Assertions.assertEquals(ScreenVolumeShape.ELLIPSOID, file.getRelativeMetadata().getScreenVolumeShape(),"SCREEN_VOLUME_SHAPE");
1397 
1398         // Check SCREEN_VOLUME_X is correctly read
1399         Assertions.assertEquals(200, file.getRelativeMetadata().getScreenVolumeX(), 0.0);
1400 
1401         // Check SCREEN_VOLUME_Y is correctly read
1402         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeY(), 0.0);
1403 
1404         // Check SCREEN_VOLUME_Z is correctly read
1405         Assertions.assertEquals(1000, file.getRelativeMetadata().getScreenVolumeZ(), 0.0);
1406 
1407         // Check SCREEN_ENTRY_TIME is correctly read
1408         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 20, 25, new TimeOffset(43, TimeOffset.SECOND,
1409                                                                                      222, TimeOffset.MILLISECOND),
1410                                                  TimeScalesFactory.getUTC()),
1411                                 file.getRelativeMetadata().getScreenEntryTime(), "SCREEN_ENTRY_TIME");
1412 
1413         // Check SCREEN_EXIT_TIME is correctly read
1414         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 23, 44, new TimeOffset(29, TimeOffset.SECOND,
1415                                                                                      324, TimeOffset.MILLISECOND),
1416                                                  TimeScalesFactory.getUTC()),
1417                                 file.getRelativeMetadata().getScreenExitTime(), "SCREEN_EXIT_TIME");
1418 
1419         // SCREEN_PC_THRESHOLD
1420         Assertions.assertEquals(1.000E-03, file.getRelativeMetadata().getScreenPcThreshold(), 0.0);
1421 
1422         // COLLISION_PERCENTILE
1423         int[] collisionPercentile = {50, 51, 52};
1424         Assertions.assertArrayEquals(collisionPercentile, file.getRelativeMetadata().getCollisionPercentile());
1425 
1426         // COLLISION_PROBABILITY
1427         Assertions.assertEquals(4.835E-05, file.getRelativeMetadata().getCollisionProbability(), 0.0);
1428 
1429         // Check COLLISION_PROBABILITY_METHOD is correctly read
1430         Assertions.assertEquals("FOSTER-1992", file.getRelativeMetadata().getCollisionProbaMethod().getName(), "COLLISION_PROBABILITY_METHOD");
1431 
1432         // COLLISION_MAX_PROBABILITY
1433         Assertions.assertEquals(1.234E-05, file.getRelativeMetadata().getMaxCollisionProbability(), 0.0);
1434 
1435         // Check COLLISION_MAX_PC_METHOD is correctly read
1436         Assertions.assertEquals("SCALE_COMBINED_COVAR", file.getRelativeMetadata().getMaxCollisionProbabilityMethod().getName(), "COLLISION_MAX_PC_METHOD");
1437 
1438         // SEFI_COLLISION_PROBABILITY
1439         Assertions.assertEquals(1.234E-05, file.getRelativeMetadata().getSefiCollisionProbability(), 0.0);
1440 
1441         // Check SEFI_COLLISION_PROBABILITY_METHOD is correctly read
1442         Assertions.assertEquals("SEFI_PC_METHOD", file.getRelativeMetadata().getSefiCollisionProbabilityMethod().getName(),"SEFI_COLLISION_PROBABILITY_METHOD");
1443 
1444         // Check SEFI_FRAGMENTATION_MODEL is correctly read
1445         Assertions.assertEquals("NASA STD BREAKUP MODEL", file.getRelativeMetadata().getSefiFragmentationModel(), "SEFI_FRAGMENTATION_MODEL");
1446 
1447         // Check PREVIOUS_MESSAGE_ID is correctly read
1448         Assertions.assertEquals("201113719185-0", file.getRelativeMetadata().getPreviousMessageId(), "PREVIOUS_MESSAGE_ID");
1449 
1450         // Check PREVIOUS_MESSAGE_EPOCH is correctly read
1451         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 10, 31, 12, TimeScalesFactory.getUTC()), 
1452                                 file.getRelativeMetadata().getPreviousMessageEpoch(), "PREVIOUS_MESSAGE_EPOCH");
1453 
1454         // Check NEXT_MESSAGE_EPOCH is correctly read
1455         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 10, 31, 12, TimeScalesFactory.getUTC()), 
1456                                 file.getRelativeMetadata().getNextMessageEpoch(), "NEXT_MESSAGE_EPOCH");
1457 
1458 
1459 
1460         // Tests additional CDM Metadata keys
1461 
1462 
1463 
1464         // Check ODM_MSG_LINK is correctly read
1465         Assertions.assertEquals("ODM_MSG_35132.txt", file.getMetadataObject1().getOdmMsgLink(), "ODM_MSG_LINK");
1466 
1467         // Check ADM_MSG_LINK is correctly read
1468         Assertions.assertEquals("ATT_MSG_35132.txt", file.getMetadataObject1().getAdmMsgLink(),"ADM_MSG_LINK");   
1469 
1470         // Check OBS_BEFORE_NEXT_MESSAGE is correctly read
1471         Assertions.assertEquals(YesNoUnknown.YES, file.getMetadataObject1().getObsBeforeNextMessage(), "OBS_BEFORE_NEXT_MESSAGE");  
1472 
1473         // Check COVARIANCE_SOURCE is correctly read
1474         Assertions.assertEquals("HAC Covariance", file.getMetadataObject1().getCovarianceSource(), "COVARIANCE_SOURCE");
1475 
1476         // Check ALT_COV_TYPE is correctly read
1477         Assertions.assertEquals(AltCovarianceType.XYZ, file.getMetadataObject1().getAltCovType(), "ALT_COV_TYPE");
1478 
1479         // Check ALT_COV_REF_FRAME is correctly read
1480         Assertions.assertEquals("EME2000", file.getMetadataObject1().getAltCovRefFrame().getName(), "ALT_COV_REF_FRAME");
1481 
1482 
1483 
1484         // CDM OD Parameters
1485 
1486 
1487 
1488         // Check OD_EPOCH is correctly read
1489         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12, TimeScalesFactory.getUTC()), 
1490                                 file.getDataObject1().getODParametersBlock().getOdEpoch(), "OD_EPOCH");
1491 
1492 
1493 
1494         // CDM Additional Parameters
1495 
1496 
1497 
1498         // Check AREA_PC_MIN is correctly read
1499         Assertions.assertEquals(5.0, file.getDataObject1().getAdditionalParametersBlock().getAreaPCMin(), 0.0);
1500 
1501         // Check AREA_PC_MAX is correctly read
1502         Assertions.assertEquals(5.4, file.getDataObject1().getAdditionalParametersBlock().getAreaPCMax(), 0.0);
1503 
1504         // Check OEB_PARENT_FRAME is correctly read
1505         Assertions.assertEquals("OEB_YAW", file.getDataObject1().getAdditionalParametersBlock().getOebParentFrame().getName(), "OEB_PARENT_FRAME");
1506 
1507         // Check OEB_PARENT_FRAME_EPOCH is correctly read
1508         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12, TimeScalesFactory.getUTC()), 
1509                                 file.getDataObject1().getAdditionalParametersBlock().getOebParentFrameEpoch(), "OEB_PARENT_FRAME_EPOCH");
1510 
1511         // Check OEB_Q1 is correctly read
1512         Assertions.assertEquals(0.03123, file.getDataObject1().getAdditionalParametersBlock().getOebQ().getQ1(), 0.0);  
1513 
1514         // Check OEB_Q2 is correctly read
1515         Assertions.assertEquals(0.78543, file.getDataObject1().getAdditionalParametersBlock().getOebQ().getQ2(), 0.0);  	    
1516 
1517         // Check OEB_Q3 is correctly read
1518         Assertions.assertEquals(0.39158, file.getDataObject1().getAdditionalParametersBlock().getOebQ().getQ3(), 0.0);  	    
1519 
1520         // Check OEB_QC is correctly read
1521         Assertions.assertEquals(0.47832, file.getDataObject1().getAdditionalParametersBlock().getOebQ().getQ0(), 0.0); 
1522 
1523         // Check OEB_MAX is correctly read
1524         Assertions.assertEquals(2.0, file.getDataObject1().getAdditionalParametersBlock().getOebMax(), 0.0); 
1525 
1526         // Check OEB_MED is correctly read
1527         Assertions.assertEquals(1.0, file.getDataObject1().getAdditionalParametersBlock().getOebIntermediate(), 0.0); 
1528 
1529         // Check OEB_MIN is correctly read
1530         Assertions.assertEquals(0.5, file.getDataObject1().getAdditionalParametersBlock().getOebMin(), 0.0); 
1531 
1532         // Check AREA_ALONG_OEB_MAX is correctly read
1533         Assertions.assertEquals(0.15, file.getDataObject1().getAdditionalParametersBlock().getOebAreaAlongMax(), 0.0); 	    
1534 
1535         // Check AREA_ALONG_OEB_MED is correctly read
1536         Assertions.assertEquals(0.3, file.getDataObject1().getAdditionalParametersBlock().getOebAreaAlongIntermediate(), 0.0); 
1537 
1538         // Check AREA_ALONG_OEB_MIN is correctly read
1539         Assertions.assertEquals(0.5, file.getDataObject1().getAdditionalParametersBlock().getOebAreaAlongMin(), 0.0); 
1540 
1541         // Check RCS is correctly read
1542         Assertions.assertEquals(2.4, file.getDataObject1().getAdditionalParametersBlock().getRcs(), 0.0);
1543 
1544         // Check RCS_MIN is correctly read
1545         Assertions.assertEquals(1.4, file.getDataObject1().getAdditionalParametersBlock().getMinRcs(), 0.0);
1546 
1547         // Check RCS_MAX is correctly read
1548         Assertions.assertEquals(3.4, file.getDataObject1().getAdditionalParametersBlock().getMaxRcs(), 0.0);
1549 
1550         // Check VM_ABSOLUTE is correctly read
1551         Assertions.assertEquals(15.0, file.getDataObject1().getAdditionalParametersBlock().getVmAbsolute(), 0.0);
1552 
1553         // Check VM_APPARENT_MIN is correctly read
1554         Assertions.assertEquals(19.0, file.getDataObject1().getAdditionalParametersBlock().getVmApparentMin(), 0.0);
1555 
1556         // Check VM_APPARENT is correctly read
1557         Assertions.assertEquals(15.4, file.getDataObject1().getAdditionalParametersBlock().getVmApparent(), 0.0);
1558 
1559         // Check VM_APPARENT_MAX is correctly read
1560         Assertions.assertEquals(14.0, file.getDataObject1().getAdditionalParametersBlock().getVmApparentMax(), 0.0);
1561 
1562         // Check REFLECTANCE is correctly read
1563         Assertions.assertEquals(0.7, file.getDataObject1().getAdditionalParametersBlock().getReflectance(), 0.0);
1564 
1565         // Check HBR is correctly read
1566         Assertions.assertEquals(2.5, file.getDataObject1().getAdditionalParametersBlock().getHbr(), 0.0); 	    
1567 
1568         // Check APOAPSIS_HEIGHT is correctly read
1569         Assertions.assertEquals(800000, file.getDataObject1().getAdditionalParametersBlock().getApoapsisAltitude(), 0.0); 	
1570 
1571         // Check PERIAPSIS_HEIGHT is correctly read
1572         Assertions.assertEquals(750000, file.getDataObject1().getAdditionalParametersBlock().getPeriapsisAltitude(), 0.0);
1573 
1574         // Check INCLINATION is correctly read
1575         Assertions.assertEquals(FastMath.toRadians(89.0), file.getDataObject1().getAdditionalParametersBlock().getInclination(), 0.0);    
1576 
1577         // Check COV_CONFIDENCE is correctly read
1578         Assertions.assertEquals(1.0, file.getDataObject1().getAdditionalParametersBlock().getCovConfidence(), 0.0);
1579 
1580         // Check COV_CONFIDENCE_METHOD is correctly read
1581         Assertions.assertEquals("Wald test", file.getDataObject1().getAdditionalParametersBlock().getCovConfidenceMethod(), "COV_CONFIDENCE_METHOD");
1582 
1583 
1584         // XYZ Covariance Matrix block	    
1585         Assertions.assertEquals(0.1,  file.getDataObject1().getXYZCovarianceBlock().getCxx(), COVARIANCE_DIAG_PRECISION);
1586         Assertions.assertEquals(0.2,   file.getDataObject1().getXYZCovarianceBlock().getCyx(), COVARIANCE_DIAG_PRECISION);
1587         Assertions.assertEquals(0.3,  file.getDataObject1().getXYZCovarianceBlock().getCyy(), COVARIANCE_DIAG_PRECISION);
1588         Assertions.assertEquals(0.4, file.getDataObject1().getXYZCovarianceBlock().getCzx(), COVARIANCE_DIAG_PRECISION);
1589         Assertions.assertEquals(0.5,  file.getDataObject1().getXYZCovarianceBlock().getCzy(), COVARIANCE_DIAG_PRECISION);
1590         Assertions.assertEquals(0.6,  file.getDataObject1().getXYZCovarianceBlock().getCzz(), COVARIANCE_DIAG_PRECISION);
1591 
1592         Assertions.assertEquals(0.7, file.getDataObject1().getXYZCovarianceBlock().getCxdotx(), COVARIANCE_PRECISION);
1593         Assertions.assertEquals(0.8,   file.getDataObject1().getXYZCovarianceBlock().getCxdoty(), COVARIANCE_PRECISION);
1594         Assertions.assertEquals(0.9, file.getDataObject1().getXYZCovarianceBlock().getCxdotz(), COVARIANCE_PRECISION);
1595         Assertions.assertEquals(0.01, file.getDataObject1().getXYZCovarianceBlock().getCxdotxdot(), COVARIANCE_PRECISION);
1596 
1597         Assertions.assertEquals(0.02, file.getDataObject1().getXYZCovarianceBlock().getCydotx(), COVARIANCE_PRECISION);
1598         Assertions.assertEquals(0.03,  file.getDataObject1().getXYZCovarianceBlock().getCydoty(), COVARIANCE_PRECISION);
1599         Assertions.assertEquals(0.04, file.getDataObject1().getXYZCovarianceBlock().getCydotz(), COVARIANCE_PRECISION);
1600         Assertions.assertEquals(0.05, file.getDataObject1().getXYZCovarianceBlock().getCydotxdot(), COVARIANCE_PRECISION);
1601         Assertions.assertEquals(0.06,  file.getDataObject1().getXYZCovarianceBlock().getCydotydot(), COVARIANCE_PRECISION);
1602 
1603         Assertions.assertEquals(0.07,  file.getDataObject1().getXYZCovarianceBlock().getCzdotx(), COVARIANCE_PRECISION);
1604         Assertions.assertEquals(0.08, file.getDataObject1().getXYZCovarianceBlock().getCzdoty(), COVARIANCE_PRECISION);
1605         Assertions.assertEquals(0.09,  file.getDataObject1().getXYZCovarianceBlock().getCzdotz(), COVARIANCE_PRECISION);
1606         Assertions.assertEquals(0.001, file.getDataObject1().getXYZCovarianceBlock().getCzdotxdot(), COVARIANCE_PRECISION);
1607         Assertions.assertEquals(0.002, file.getDataObject1().getXYZCovarianceBlock().getCzdotydot(), COVARIANCE_PRECISION);
1608         Assertions.assertEquals(0.003,  file.getDataObject1().getXYZCovarianceBlock().getCzdotzdot(), COVARIANCE_PRECISION);
1609         
1610         Assertions.assertEquals(0.07,  file.getDataObject1().getXYZCovarianceBlock().getCdrgx(), COVARIANCE_PRECISION);
1611         Assertions.assertEquals(0.08, file.getDataObject1().getXYZCovarianceBlock().getCdrgy(), COVARIANCE_PRECISION);
1612         Assertions.assertEquals(0.09,  file.getDataObject1().getXYZCovarianceBlock().getCdrgz(), COVARIANCE_PRECISION);
1613         Assertions.assertEquals(0.001, file.getDataObject1().getXYZCovarianceBlock().getCdrgxdot(), COVARIANCE_PRECISION);
1614         Assertions.assertEquals(0.002, file.getDataObject1().getXYZCovarianceBlock().getCdrgydot(), COVARIANCE_PRECISION);
1615         Assertions.assertEquals(0.003,  file.getDataObject1().getXYZCovarianceBlock().getCdrgzdot(), COVARIANCE_PRECISION);
1616         Assertions.assertEquals(0.004,  file.getDataObject1().getXYZCovarianceBlock().getCdrgdrg(), COVARIANCE_PRECISION);
1617         
1618         Assertions.assertEquals(0.07,  file.getDataObject1().getXYZCovarianceBlock().getCsrpx(), COVARIANCE_PRECISION);
1619         Assertions.assertEquals(0.08, file.getDataObject1().getXYZCovarianceBlock().getCsrpy(), COVARIANCE_PRECISION);
1620         Assertions.assertEquals(0.09,  file.getDataObject1().getXYZCovarianceBlock().getCsrpz(), COVARIANCE_PRECISION);
1621         Assertions.assertEquals(0.001, file.getDataObject1().getXYZCovarianceBlock().getCsrpxdot(), COVARIANCE_PRECISION);
1622         Assertions.assertEquals(0.002, file.getDataObject1().getXYZCovarianceBlock().getCsrpydot(), COVARIANCE_PRECISION);
1623         Assertions.assertEquals(0.003,  file.getDataObject1().getXYZCovarianceBlock().getCsrpzdot(), COVARIANCE_PRECISION);
1624         Assertions.assertEquals(0.004,  file.getDataObject1().getXYZCovarianceBlock().getCsrpdrg(), COVARIANCE_PRECISION);
1625         Assertions.assertEquals(0.005,  file.getDataObject1().getXYZCovarianceBlock().getCsrpsrp(), COVARIANCE_PRECISION);
1626         
1627         Assertions.assertEquals(0.07,  file.getDataObject1().getXYZCovarianceBlock().getCthrx(), COVARIANCE_PRECISION);
1628         Assertions.assertEquals(0.08, file.getDataObject1().getXYZCovarianceBlock().getCthry(), COVARIANCE_PRECISION);
1629         Assertions.assertEquals(0.09,  file.getDataObject1().getXYZCovarianceBlock().getCthrz(), COVARIANCE_PRECISION);
1630         Assertions.assertEquals(0.001, file.getDataObject1().getXYZCovarianceBlock().getCthrxdot(), COVARIANCE_PRECISION);
1631         Assertions.assertEquals(0.002, file.getDataObject1().getXYZCovarianceBlock().getCthrydot(), COVARIANCE_PRECISION);
1632         Assertions.assertEquals(0.003,  file.getDataObject1().getXYZCovarianceBlock().getCthrzdot(), COVARIANCE_PRECISION);
1633         Assertions.assertEquals(0.004,  file.getDataObject1().getXYZCovarianceBlock().getCthrdrg(), COVARIANCE_PRECISION);
1634         Assertions.assertEquals(0.005,  file.getDataObject1().getXYZCovarianceBlock().getCthrsrp(), COVARIANCE_PRECISION);
1635         Assertions.assertEquals(0.006,  file.getDataObject1().getXYZCovarianceBlock().getCthrthr(), COVARIANCE_PRECISION);
1636         
1637 
1638         // OBJECT 2 - Eigenvector covariance block
1639         Assertions.assertEquals(AltCovarianceType.CSIG3EIGVEC3, file.getMetadataObject2().getAltCovType(), "ALT_COV_TYPE");
1640         Assertions.assertEquals("Object2 Covariance in the Sigma / eigenvector format",
1641                                 file.getDataObject2().getSig3EigVec3CovarianceBlock().getComments().get(0));
1642         Assertions.assertEquals(12,  file.getDataObject2().getSig3EigVec3CovarianceBlock().getCsig3eigvec3().length);
1643         for (int i=0; i<12; i++) {
1644             Assertions.assertEquals(i+1, file.getDataObject2().getSig3EigVec3CovarianceBlock().getCsig3eigvec3()[i],
1645                                     COVARIANCE_DIAG_PRECISION);
1646         }
1647 
1648 
1649 
1650         // Additional covariance metadata OBJ 1
1651 
1652         Assertions.assertEquals(2.5,  file.getDataObject1().getAdditionalCovMetadataBlock().getDensityForecastUncertainty(), 0.0);
1653         Assertions.assertEquals(0.5,  file.getDataObject1().getAdditionalCovMetadataBlock().getcScaleFactorMin(), 0.0);
1654         Assertions.assertEquals(1.0,  file.getDataObject1().getAdditionalCovMetadataBlock().getcScaleFactor(), 0.0);
1655         Assertions.assertEquals(1.5,  file.getDataObject1().getAdditionalCovMetadataBlock().getcScaleFactorMax(), 0.0);
1656         Assertions.assertEquals("Data source of additional covariance metadata", 
1657                                 file.getDataObject1().getAdditionalCovMetadataBlock().getScreeningDataSource(), "SCREENING_DATA_SOURCE");
1658         Assertions.assertEquals(3,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorPosition().length);
1659         Assertions.assertEquals(1.0,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorPosition()[0], 0.0);
1660         Assertions.assertEquals(2.0,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorPosition()[1], 0.0);
1661         Assertions.assertEquals(3.0,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorPosition()[2], 0.0);
1662         Assertions.assertEquals(3,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorVelocity().length);
1663         Assertions.assertEquals(0.1,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorVelocity()[0], 0.0);
1664         Assertions.assertEquals(0.2,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorVelocity()[1], 0.0);
1665         Assertions.assertEquals(0.3,  file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorVelocity()[2], 0.0);
1666 
1667 
1668         // User defined parameters
1669 
1670         Assertions.assertEquals(1, file.getUserDefinedParameters().getComments().size());
1671         Assertions.assertEquals("User Parameters", file.getUserDefinedParameters().getComments().get(0));
1672         Assertions.assertEquals(1, file.getUserDefinedParameters().getParameters().size());
1673         Assertions.assertEquals("2020-01-29T13:30:00", file.getUserDefinedParameters().getParameters().get("OBJ1_TIME_LASTOB_START"));
1674 
1675 
1676         // Check the rest of the file against any regressions.
1677 
1678         // Verify general data
1679         Assertions.assertEquals(IERSConventions.IERS_2010, file.getConventions());
1680         Assertions.assertEquals(DataContext.getDefault(),  file.getDataContext());
1681 
1682         // Check Header Block
1683         Assertions.assertEquals(2.0, file.getHeader().getFormatVersion(), 1.0e-10);
1684         Assertions.assertEquals(new AbsoluteDate(2010, 3, 12, 22, 31, 12,
1685                                                  TimeScalesFactory.getUTC()),
1686                                 file.getHeader().getCreationDate());
1687         Assertions.assertEquals("JSPOC", file.getHeader().getOriginator());
1688         Assertions.assertEquals("201113719185-1", file.getHeader().getMessageId());
1689 
1690         // OBJECT1
1691         // Check Relative Metadata Block
1692         Assertions.assertEquals(new AbsoluteDate(2010, 3, 13, 22, 37, new TimeOffset(52, TimeOffset.SECOND, 618, TimeOffset.MILLISECOND),
1693                                                  TimeScalesFactory.getUTC()),
1694                                 file.getRelativeMetadata().getTca());
1695         Assertions.assertEquals(715.0,  file.getRelativeMetadata().getMissDistance(),DISTANCE_PRECISION);
1696 
1697         // Check Metadata Block
1698         Assertions.assertEquals("OBJECT1",                    file.getMetadataObject1().getObject());
1699         Assertions.assertEquals("12345",                      file.getMetadataObject1().getObjectDesignator());
1700         Assertions.assertEquals("SATCAT",                     file.getMetadataObject1().getCatalogName());
1701         Assertions.assertEquals("SATELLITE A",                file.getMetadataObject1().getObjectName());
1702         Assertions.assertEquals("1997-030E",                  file.getMetadataObject1().getInternationalDes());
1703         Assertions.assertEquals("EPHEMERIS SATELLITE A",      file.getMetadataObject1().getEphemName());
1704         Assertions.assertEquals(CovarianceMethod.CALCULATED,  file.getMetadataObject1().getCovarianceMethod());
1705         Assertions.assertEquals(Maneuvrable.YES,              file.getMetadataObject1().getManeuverable());
1706         Assertions.assertEquals(CelestialBodyFrame.EME2000,   file.getMetadataObject1().getRefFrame().asCelestialBodyFrame());
1707         Assertions.assertEquals("UTC",                        file.getMetadataObject1().getTimeSystem().name());
1708 
1709         // Check data block
1710         // State vector block
1711         Assertions.assertEquals(2570.097065e3,  file.getDataObject1().getStateVectorBlock().getPositionVector().getX(), DISTANCE_PRECISION);
1712         Assertions.assertEquals(2244.654904e3,  file.getDataObject1().getStateVectorBlock().getPositionVector().getY(), DISTANCE_PRECISION);
1713         Assertions.assertEquals(6281.497978e3,  file.getDataObject1().getStateVectorBlock().getPositionVector().getZ(), DISTANCE_PRECISION);
1714         Assertions.assertEquals(4.418769571e3,  file.getDataObject1().getStateVectorBlock().getVelocityVector().getX(), DERIVATION_PRECISION);
1715         Assertions.assertEquals(4.833547743e3,  file.getDataObject1().getStateVectorBlock().getVelocityVector().getY(), DERIVATION_PRECISION);
1716         Assertions.assertEquals(-3.526774282e3, file.getDataObject1().getStateVectorBlock().getVelocityVector().getZ(), DERIVATION_PRECISION);
1717         // Covariance Matrix block
1718         Assertions.assertEquals(4.142e1,  file.getDataObject1().getRTNCovarianceBlock().getCrr(), COVARIANCE_DIAG_PRECISION);
1719         Assertions.assertEquals(-8.579,   file.getDataObject1().getRTNCovarianceBlock().getCtr(), COVARIANCE_DIAG_PRECISION);
1720         Assertions.assertEquals(2.533e3,  file.getDataObject1().getRTNCovarianceBlock().getCtt(), COVARIANCE_DIAG_PRECISION);
1721         Assertions.assertEquals(-2.313e1, file.getDataObject1().getRTNCovarianceBlock().getCnr(), COVARIANCE_DIAG_PRECISION);
1722         Assertions.assertEquals(1.336e1,  file.getDataObject1().getRTNCovarianceBlock().getCnt(), COVARIANCE_DIAG_PRECISION);
1723         Assertions.assertEquals(7.098e1,  file.getDataObject1().getRTNCovarianceBlock().getCnn(), COVARIANCE_DIAG_PRECISION);
1724 
1725         Assertions.assertEquals(2.520e-3, file.getDataObject1().getRTNCovarianceBlock().getCrdotr(), COVARIANCE_PRECISION);
1726         Assertions.assertEquals(-5.476,   file.getDataObject1().getRTNCovarianceBlock().getCrdott(), COVARIANCE_PRECISION);
1727         Assertions.assertEquals(8.626e-4, file.getDataObject1().getRTNCovarianceBlock().getCrdotn(), COVARIANCE_PRECISION);
1728         Assertions.assertEquals(5.744e-3, file.getDataObject1().getRTNCovarianceBlock().getCrdotrdot(), COVARIANCE_PRECISION);
1729 
1730         Assertions.assertEquals(-1.006e-2, file.getDataObject1().getRTNCovarianceBlock().getCtdotr(), COVARIANCE_PRECISION);
1731         Assertions.assertEquals(4.041e-3,  file.getDataObject1().getRTNCovarianceBlock().getCtdott(), COVARIANCE_PRECISION);
1732         Assertions.assertEquals(-1.359e-3, file.getDataObject1().getRTNCovarianceBlock().getCtdotn(), COVARIANCE_PRECISION);
1733         Assertions.assertEquals(-1.502e-5, file.getDataObject1().getRTNCovarianceBlock().getCtdotrdot(), COVARIANCE_PRECISION);
1734         Assertions.assertEquals(1.049e-5,  file.getDataObject1().getRTNCovarianceBlock().getCtdottdot(), COVARIANCE_PRECISION);
1735 
1736         Assertions.assertEquals(1.053e-3,  file.getDataObject1().getRTNCovarianceBlock().getCndotr(), COVARIANCE_PRECISION);
1737         Assertions.assertEquals(-3.412e-3, file.getDataObject1().getRTNCovarianceBlock().getCndott(), COVARIANCE_PRECISION);
1738         Assertions.assertEquals(1.213e-2,  file.getDataObject1().getRTNCovarianceBlock().getCndotn(), COVARIANCE_PRECISION);
1739         Assertions.assertEquals(-3.004e-6, file.getDataObject1().getRTNCovarianceBlock().getCndotrdot(), COVARIANCE_PRECISION);
1740         Assertions.assertEquals(-1.091e-6, file.getDataObject1().getRTNCovarianceBlock().getCndottdot(), COVARIANCE_PRECISION);
1741         Assertions.assertEquals(5.529e-5,  file.getDataObject1().getRTNCovarianceBlock().getCndotndot(), COVARIANCE_PRECISION);
1742 
1743         Assertions.assertEquals(2.520e-3,   file.getDataObject1().getRTNCovarianceBlock().
1744                                 getRTNCovarianceMatrix().getEntry(3, 0), COVARIANCE_PRECISION);
1745         Assertions.assertEquals(Double.NaN, file.getDataObject1().getRTNCovarianceBlock().
1746                                 getRTNCovarianceMatrix().getEntry(7, 6), COVARIANCE_PRECISION);
1747 
1748         // OBJECT2
1749         // Check Relative Metadata Block
1750         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getTca(),
1751                                 file.getRelativeMetadata().getTca());
1752         Assertions.assertEquals(file.getSegments().get(1).getMetadata().getRelativeMetadata().getMissDistance(),  
1753                                 file.getRelativeMetadata().getMissDistance(),DISTANCE_PRECISION);
1754 
1755         // Check Metadata Block
1756         Assertions.assertEquals("OBJECT2",                    file.getMetadataObject2().getObject());
1757         Assertions.assertEquals("30337",                      file.getMetadataObject2().getObjectDesignator());
1758         Assertions.assertEquals("SATCAT",                     file.getMetadataObject2().getCatalogName());
1759         Assertions.assertEquals("FENGYUN 1C DEB",             file.getMetadataObject2().getObjectName());
1760         Assertions.assertEquals("1999-025AA",                 file.getMetadataObject2().getInternationalDes());
1761         Assertions.assertEquals("NONE",                       file.getMetadataObject2().getEphemName());
1762         Assertions.assertEquals(CovarianceMethod.CALCULATED,  file.getMetadataObject2().getCovarianceMethod());
1763         Assertions.assertEquals(Maneuvrable.NO,               file.getMetadataObject2().getManeuverable());
1764         Assertions.assertEquals(CelestialBodyFrame.EME2000,   file.getMetadataObject2().getRefFrame().asCelestialBodyFrame());
1765         Assertions.assertEquals("UTC",                        file.getMetadataObject2().getTimeSystem().name());
1766 
1767         // Check data block
1768         Assertions.assertEquals(2569.540800e3,  file.getDataObject2().getStateVectorBlock().getPositionVector().getX(), DISTANCE_PRECISION);
1769         Assertions.assertEquals(2245.093614e3,  file.getDataObject2().getStateVectorBlock().getPositionVector().getY(), DISTANCE_PRECISION);
1770         Assertions.assertEquals(6281.599946e3,  file.getDataObject2().getStateVectorBlock().getPositionVector().getZ(), DISTANCE_PRECISION);
1771         Assertions.assertEquals(-2.888612500e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getX(), DERIVATION_PRECISION);
1772         Assertions.assertEquals(-6.007247516e3, file.getDataObject2().getStateVectorBlock().getVelocityVector().getY(), DERIVATION_PRECISION);
1773         Assertions.assertEquals(3.328770172e3,  file.getDataObject2().getStateVectorBlock().getVelocityVector().getZ(), DERIVATION_PRECISION);
1774         // Covariance Matrix block
1775         Assertions.assertEquals(1.337e3,   file.getDataObject2().getRTNCovarianceBlock().getCrr(), COVARIANCE_DIAG_PRECISION);
1776         Assertions.assertEquals(-4.806e4,  file.getDataObject2().getRTNCovarianceBlock().getCtr(), COVARIANCE_DIAG_PRECISION);
1777         Assertions.assertEquals(2.492e6,   file.getDataObject2().getRTNCovarianceBlock().getCtt(), COVARIANCE_DIAG_PRECISION);
1778         Assertions.assertEquals(-3.298e1,  file.getDataObject2().getRTNCovarianceBlock().getCnr(), COVARIANCE_DIAG_PRECISION);
1779         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(), COVARIANCE_DIAG_PRECISION);
1780         Assertions.assertEquals(7.105e1,   file.getDataObject2().getRTNCovarianceBlock().getCnn(), COVARIANCE_DIAG_PRECISION);
1781 
1782         Assertions.assertEquals(2.591e-3,  file.getDataObject2().getRTNCovarianceBlock().getCrdotr(), COVARIANCE_PRECISION);
1783         Assertions.assertEquals(-4.152e-2, file.getDataObject2().getRTNCovarianceBlock().getCrdott(), COVARIANCE_PRECISION);
1784         Assertions.assertEquals(-1.784e-6, file.getDataObject2().getRTNCovarianceBlock().getCrdotn(), COVARIANCE_PRECISION);
1785         Assertions.assertEquals(6.886e-5,  file.getDataObject2().getRTNCovarianceBlock().getCrdotrdot(), COVARIANCE_PRECISION);
1786 
1787         Assertions.assertEquals(-1.016e-2, file.getDataObject2().getRTNCovarianceBlock().getCtdotr(), COVARIANCE_PRECISION);
1788         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getCtdott(), COVARIANCE_PRECISION);
1789         Assertions.assertEquals(1.637e-3,  file.getDataObject2().getRTNCovarianceBlock().getCtdotn(), COVARIANCE_PRECISION);
1790         Assertions.assertEquals(-2.987e-6, file.getDataObject2().getRTNCovarianceBlock().getCtdotrdot(), COVARIANCE_PRECISION);
1791         Assertions.assertEquals(1.059e-5,  file.getDataObject2().getRTNCovarianceBlock().getCtdottdot(), COVARIANCE_PRECISION);
1792 
1793         Assertions.assertEquals(4.400e-3,  file.getDataObject2().getRTNCovarianceBlock().getCndotr(), COVARIANCE_PRECISION);
1794         Assertions.assertEquals(8.482e-3,  file.getDataObject2().getRTNCovarianceBlock().getCndott(), COVARIANCE_PRECISION);
1795         Assertions.assertEquals(8.633e-5,  file.getDataObject2().getRTNCovarianceBlock().getCndotn(), COVARIANCE_PRECISION);
1796         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getCndotrdot(), COVARIANCE_PRECISION);
1797         Assertions.assertEquals(-4.594e-6, file.getDataObject2().getRTNCovarianceBlock().getCndottdot(), COVARIANCE_PRECISION);
1798         Assertions.assertEquals(5.178e-5,  file.getDataObject2().getRTNCovarianceBlock().getCndotndot(), COVARIANCE_PRECISION);
1799         // Test in the matrix
1800         Assertions.assertEquals(1.337e3,   file.getDataObject2().getRTNCovarianceBlock().getCrr(), COVARIANCE_DIAG_PRECISION);
1801         Assertions.assertEquals(-4.806e4,  file.getDataObject2().getRTNCovarianceBlock().getCtr(), COVARIANCE_DIAG_PRECISION);
1802         Assertions.assertEquals(2.492e6,   file.getDataObject2().getRTNCovarianceBlock().getCtt(), COVARIANCE_DIAG_PRECISION);
1803         Assertions.assertEquals(-3.298e1,  file.getDataObject2().getRTNCovarianceBlock().getCnr(), COVARIANCE_DIAG_PRECISION);
1804         Assertions.assertEquals(-7.5888e2, file.getDataObject2().getRTNCovarianceBlock().getCnt(), COVARIANCE_DIAG_PRECISION);
1805         Assertions.assertEquals(7.105e1,   file.getDataObject2().getRTNCovarianceBlock().getCnn(), COVARIANCE_DIAG_PRECISION);
1806 
1807         Assertions.assertEquals(2.591e-3,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 0), COVARIANCE_PRECISION);
1808         Assertions.assertEquals(-4.152e-2, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 1), COVARIANCE_PRECISION);
1809         Assertions.assertEquals(-1.784e-6, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 2), COVARIANCE_PRECISION);
1810         Assertions.assertEquals(6.886e-5,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(3, 3), COVARIANCE_PRECISION);
1811 
1812         Assertions.assertEquals(-1.016e-2, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 0), COVARIANCE_PRECISION);
1813         Assertions.assertEquals(-1.506e-4, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 1), COVARIANCE_PRECISION);
1814         Assertions.assertEquals(1.637e-3,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 2), COVARIANCE_PRECISION);
1815         Assertions.assertEquals(-2.987e-6, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 3), COVARIANCE_PRECISION);
1816         Assertions.assertEquals(1.059e-5,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(4, 4), COVARIANCE_PRECISION);
1817 
1818         Assertions.assertEquals(4.400e-3,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 0), COVARIANCE_PRECISION);
1819         Assertions.assertEquals(8.482e-3,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 1), COVARIANCE_PRECISION);
1820         Assertions.assertEquals(8.633e-5,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 2), COVARIANCE_PRECISION);
1821         Assertions.assertEquals(-1.903e-6, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 3), COVARIANCE_PRECISION);
1822         Assertions.assertEquals(-4.594e-6, file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 4), COVARIANCE_PRECISION);
1823         Assertions.assertEquals(5.178e-5,  file.getDataObject2().getRTNCovarianceBlock().getRTNCovarianceMatrix().getEntry(5, 5), COVARIANCE_PRECISION);
1824 
1825         // Improve coverage
1826         // ----------------
1827 
1828         Assertions.assertTrue(parser.inData()); // Always true by construction
1829         
1830         // AdditionalCovarianceMetadata conditions coverage
1831         file.getDataObject1().getAdditionalCovMetadataBlock().validate(1.0);
1832         file.getDataObject1().getAdditionalCovMetadataBlock().setDcpSensitivityVectorPosition(null);
1833         file.getDataObject1().getAdditionalCovMetadataBlock().setDcpSensitivityVectorVelocity(null);
1834         Assertions.assertNull(file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorPosition());
1835         Assertions.assertNull(file.getDataObject1().getAdditionalCovMetadataBlock().getDcpSensitivityVectorVelocity());
1836     }
1837 
1838     @Test
1839     public void test_issue_942_KVN() {
1840 
1841         // File
1842         final String ex = "/ccsds/cdm/CDMExample_issue942.txt";
1843 
1844         // Initialize the parser
1845         final CdmParser parser = new ParserBuilder().buildCdmParser();
1846 
1847         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1848 
1849         // Generated CDM file
1850         final Cdm file = parser.parseMessage(source);
1851 
1852         // OBJECT1
1853         Assertions.assertEquals(Maneuvrable.N_A, file.getMetadataObject1().getManeuverable());    
1854         // OBJECT2
1855         Assertions.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
1856     }
1857 
1858     @Test
1859     public void test_issue_942_XML() {
1860 
1861         // File
1862         final String ex = "/ccsds/cdm/CDMExample_issue942.xml";
1863 
1864         // Initialize the parser
1865         final CdmParser parser = new ParserBuilder().buildCdmParser();
1866 
1867         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1868 
1869         // Generated CDM file
1870         final Cdm file = parser.parseMessage(source);
1871 
1872         // OBJECT1
1873         Assertions.assertEquals(Maneuvrable.N_A, file.getMetadataObject1().getManeuverable());    
1874         // OBJECT2
1875         Assertions.assertEquals(Maneuvrable.NO, file.getMetadataObject2().getManeuverable());
1876     }
1877 
1878     @Test
1879     public void test_issue_944() {
1880 
1881         // File
1882         final String ex = "/ccsds/cdm/CDMExample_issue_944.xml";
1883 
1884         // Initialize the parser
1885         final CdmParser parser = new ParserBuilder().buildCdmParser();
1886 
1887         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1888 
1889         // Generated CDM file
1890         final Cdm file = parser.parseMessage(source);
1891 
1892         // Check AREA_DRG
1893         Assertions.assertEquals(3, file.getDataObject1().getAdditionalParametersBlock().getAreaDRG(), 0.0);
1894 
1895         // Check AREA_SRP
1896         Assertions.assertEquals(10, file.getDataObject1().getAdditionalParametersBlock().getAreaSRP(), 0.0);
1897     }
1898 
1899     @Test
1900     public void test_issue_1319() {
1901 
1902         // File
1903         final String ex = "/ccsds/cdm/CDMExample_issue1319.xml";
1904 
1905         // Initialize the parser
1906         final CdmParser parser = new ParserBuilder().buildCdmParser();
1907 
1908         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1909 
1910         // Generated CDM file
1911         final Cdm file = parser.parseMessage(source);
1912 
1913         Assertions.assertNull(file.getRelativeMetadata().getStartScreenPeriod());
1914     }
1915 
1916     @Test
1917     public void test_issue_1319_throw_exception_when_mandatory_empty_values() {
1918 
1919         // File
1920         final String ex = "/ccsds/cdm/CDMExample_issue1319_mandatory_empty_value.xml";
1921 
1922         // Initialize the parser
1923         final CdmParser parser = new ParserBuilder().buildCdmParser();
1924 
1925         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1926 
1927         OrekitException exception = Assertions.assertThrows(OrekitException.class, () -> parser.parseMessage(source));
1928         Assertions.assertEquals("value for key X has not been initialized", exception.getMessage());
1929     }
1930 
1931     @Test
1932     public void test_issue_1458() {
1933 
1934         // File
1935         final String ex = "/ccsds/cdm/CDMExample_issue1458.xml";
1936 
1937         // Initialize the parser
1938         final CdmParser parser = new ParserBuilder().buildCdmParser();
1939 
1940         final DataSource source = new DataSource(ex, () -> getClass().getResourceAsStream(ex));
1941 
1942         // Generated CDM file
1943         Cdm file = parser.parseMessage(source);
1944 
1945         // dummy assertion: the aim of the test is to show that empty unit can be parsed
1946         Assertions.assertNull(file.getDataObject1().getODParametersBlock());
1947     }
1948 }