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 org.junit.jupiter.api.Assertions;
20  import org.junit.jupiter.api.BeforeEach;
21  import org.junit.jupiter.api.Test;
22  import org.orekit.Utils;
23  import org.orekit.annotation.DefaultDataContext;
24  import org.orekit.bodies.CelestialBodyFactory;
25  import org.orekit.data.DataContext;
26  import org.orekit.errors.OrekitException;
27  import org.orekit.errors.OrekitMessages;
28  import org.orekit.files.ccsds.definitions.BodyFacade;
29  import org.orekit.files.ccsds.definitions.CcsdsFrameMapper;
30  import org.orekit.files.ccsds.definitions.CenterName;
31  import org.orekit.files.ccsds.definitions.FrameFacade;
32  import org.orekit.frames.Frame;
33  import org.orekit.frames.FramesFactory;
34  import org.orekit.frames.Transform;
35  import org.orekit.time.AbsoluteDate;
36  import org.orekit.utils.IERSConventions;
37  
38  /** Tests for CdmMetaData class.
39   * These tests are used to increase condition coverage, other global tests are in CdmParser/WriterTest classes.
40   */
41  public class CdmMetaDataTest {
42  
43      @BeforeEach
44      public void setUp() {
45          Utils.setDataRoot("regular-data");
46      }
47      
48      /** Condition coverage on the getFrame method. */
49      @Test
50      @DefaultDataContext
51      public void testGetFrame() {
52          
53          CdmMetadata meta = new CdmMetadata();
54          
55          // refFrame == null
56          try {
57              meta.getFrame();
58              Assertions.fail("an exception should have been thrown");
59          } catch (OrekitException oe) {
60              Assertions.assertEquals(OrekitMessages.CCSDS_INVALID_FRAME, oe.getSpecifier());
61              Assertions.assertEquals("No reference frame", oe.getParts()[0]);
62          }
63          
64          // orbitCenter.getBody() == null
65          try {
66              meta.setOrbitCenter(new BodyFacade("dummy center", null));
67              meta.getFrame();
68              Assertions.fail("an exception should have been thrown");
69          } catch (OrekitException oe) {
70              Assertions.assertEquals(OrekitMessages.NO_DATA_LOADED_FOR_CELESTIAL_BODY, oe.getSpecifier());
71              Assertions.assertEquals("dummy center", oe.getParts()[0]);
72          }
73          
74          // refFrame.asFrame() == null
75          meta.setOrbitCenter(BodyFacade.create(CenterName.MARS));
76          try {
77              meta.setRefFrame(new FrameFacade(null, null, null, null, "dummy frame"));
78              meta.getFrame();
79              Assertions.fail("an exception should have been thrown");
80          } catch (OrekitException oe) {
81              Assertions.assertEquals(OrekitMessages.CCSDS_INVALID_FRAME, oe.getSpecifier());
82              Assertions.assertEquals("dummy frame", oe.getParts()[0]);
83          }
84          
85          // refFrame.asCelestialBodyFrame() == CelestialBodyFrame.MCI
86          // AND
87          // CelestialBodyFactory.MARS.equals(orbitCenter.getBody().getName())
88          meta.setRefFrame(FrameFacade.map(CelestialBodyFactory.getMars().getInertiallyOrientedFrame()));
89          Assertions.assertEquals(CelestialBodyFactory.getMars().getInertiallyOrientedFrame(), meta.getFrame());
90          
91          // refFrame.asCelestialBodyFrame() == CelestialBodyFrame.ICRF
92          // AND
93          // isIcrf && isSolarSystemBarycenter
94          final Frame icrf = FramesFactory.getICRF();
95          meta.setOrbitCenter(BodyFacade.create(CenterName.SOLAR_SYSTEM_BARYCENTER));
96          meta.setRefFrame(FrameFacade.map(icrf));
97          Assertions.assertEquals(icrf, meta.getFrame());
98  
99          // check frame mapping.
100         BodyFacade bodyFacade = new BodyFacade("TEST_BODY", null);
101         FrameFacade frameFacade = new FrameFacade(null, null, null, null, "TEST_FRAME");
102         Frame frame = new Frame(Frame.getRoot(), (Transform) null, "TEST");
103         final CcsdsFrameMapper frameMapper = new CcsdsFrameMapper() {
104             @Override
105             public Frame buildCcsdsFrame(FrameFacade orientation, AbsoluteDate epoch) {
106                 throw new UnsupportedOperationException();
107             }
108 
109             @Override
110             public Frame buildCcsdsFrame(BodyFacade center,
111                                          FrameFacade orientation,
112                                          AbsoluteDate epoch) {
113                 Assertions.assertSame(center, bodyFacade);
114                 Assertions.assertSame(orientation, frameFacade);
115                 return frame;
116             }
117         };
118         meta = new CdmMetadata(DataContext.getDefault(), frameMapper);
119         meta.setOrbitCenter(bodyFacade);
120         meta.setRefFrame(frameFacade);
121         Assertions.assertSame(meta.getFrame(), frame);
122         Assertions.assertSame(meta.getFrameMapper(), frameMapper);
123     }
124 
125     /** Condition coverage on the setAltCovRefFrame method. */
126     @Test
127     @DefaultDataContext
128     public void testSetAltCovRefFrame() {
129         
130         final CdmMetadata meta = new CdmMetadata();
131         final FrameFacade altCovRefFrame = new FrameFacade(null, null, null, null, null);
132 
133         // getAltCovType()
134         try {
135             meta.setAltCovRefFrame(altCovRefFrame);
136             Assertions.fail("an exception should have been thrown");
137         } catch (OrekitException oe) {
138             Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
139             Assertions.assertEquals(CdmMetadataKey.ALT_COV_TYPE, oe.getParts()[0]);
140         }
141         
142         // altCovRefFrame.asFrame() == null
143         meta.setAltCovType(AltCovarianceType.CSIG3EIGVEC3);
144         try {
145             meta.setAltCovRefFrame(altCovRefFrame);
146             Assertions.fail("an exception should have been thrown");
147         } catch (OrekitException oe) {
148             Assertions.assertEquals(OrekitMessages.CCSDS_INVALID_FRAME, oe.getSpecifier());
149             Assertions.assertNull(oe.getParts()[0]);
150         }
151         
152         // Frame not allowed (allowed frames are GCRF, EME2000, ITRF)
153         FrameFacade frameFacade = FrameFacade.map(FramesFactory.getICRF());
154         try {
155             meta.setAltCovRefFrame(frameFacade);
156             Assertions.fail("an exception should have been thrown");
157         } catch (OrekitException oe) {
158             Assertions.assertEquals(OrekitMessages.CCSDS_INVALID_FRAME, oe.getSpecifier());
159             Assertions.assertEquals(frameFacade.getName(), oe.getParts()[0]);
160         }
161         
162         // Test the 3 allowed frames
163         frameFacade = FrameFacade.map(FramesFactory.getGCRF());
164         meta.setAltCovRefFrame(frameFacade);
165         Assertions.assertEquals(frameFacade, meta.getAltCovRefFrame());
166         
167         frameFacade = FrameFacade.map(FramesFactory.getEME2000());
168         meta.setAltCovRefFrame(frameFacade);
169         Assertions.assertEquals(frameFacade, meta.getAltCovRefFrame());
170         
171         frameFacade = FrameFacade.map(FramesFactory.getITRF(IERSConventions.IERS_2010, true));
172         meta.setAltCovRefFrame(frameFacade);
173         Assertions.assertEquals(frameFacade, meta.getAltCovRefFrame());
174     }
175 }