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