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.Test;
21  import org.orekit.errors.OrekitException;
22  import org.orekit.errors.OrekitMessages;
23  import org.orekit.time.AbsoluteDate;
24  
25  /** Tests for CdmRelativeMetaData class.
26   * These tests are used to increase condition coverage, other global tests are in CdmParser/WriterTest classes.
27   */
28  public class CdmRelativeMetaDataTest {
29  
30      /** Condition coverage on the checkScreenVolumeConditions method. */
31      @Test
32      public void testCheckScreenVolumeConditions() {
33  
34          final CdmRelativeMetadata meta = new CdmRelativeMetadata();
35          meta.setScreenType(ScreenType.SHAPE);
36  
37          // getScreenEntryTime() == null
38          try {
39              meta.checkScreenVolumeConditions();
40              Assertions.fail("an exception should have been thrown");
41          } catch (OrekitException oe) {
42              Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
43              Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_ENTRY_TIME, oe.getParts()[0]);
44          }
45          meta.setScreenEntryTime(AbsoluteDate.ARBITRARY_EPOCH);
46  
47          // getScreenExitTime() == null
48          try {
49              meta.checkScreenVolumeConditions();
50              Assertions.fail("an exception should have been thrown");
51          } catch (OrekitException oe) {
52              Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
53              Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_EXIT_TIME, oe.getParts()[0]);
54          }
55          meta.setScreenExitTime(AbsoluteDate.ARBITRARY_EPOCH);
56  
57          // getScreenVolumeShape() == null
58          try {
59              meta.checkScreenVolumeConditions();
60              Assertions.fail("an exception should have been thrown");
61          } catch (OrekitException oe) {
62              Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
63              Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_VOLUME_SHAPE, oe.getParts()[0]);
64          }
65  
66          // ScreenVolumeShape.SPHERE && getScreenVolumeRadius() is NaN
67          meta.setScreenVolumeShape(ScreenVolumeShape.SPHERE);
68          try {
69              meta.checkScreenVolumeConditions();
70              Assertions.fail("an exception should have been thrown");
71          } catch (OrekitException oe) {
72              Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
73              Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_VOLUME_RADIUS, oe.getParts()[0]);
74          }
75          
76          // ScreenVolumeShape.SPHERE && getScreenVolumeRadius() not NaN
77          meta.setScreenVolumeShape(ScreenVolumeShape.SPHERE);
78          meta.setScreenVolumeRadius(1.);
79          meta.checkScreenVolumeConditions();
80          Assertions.assertEquals(1.,  meta.getScreenVolumeRadius(), 0.);
81          
82          // ScreenVolumeShape.BOX or ScreenVolumeShape.ELLIPSOID
83          final ScreenVolumeShape[] shapes = new ScreenVolumeShape[] { ScreenVolumeShape.BOX, ScreenVolumeShape.ELLIPSOID };
84  
85          for (final ScreenVolumeShape shape : shapes) {
86  
87              meta.setScreenVolumeShape(shape);
88  
89              // Re-init errors
90              meta.setScreenVolumeFrame(null);
91              meta.setScreenVolumeX(Double.NaN);
92              meta.setScreenVolumeY(Double.NaN);
93              meta.setScreenVolumeZ(Double.NaN);
94  
95              // getScreenVolumeFrame() == null
96              try {
97                  meta.checkScreenVolumeConditions();
98                  Assertions.fail("an exception should have been thrown");
99              } catch (OrekitException oe) {
100                 Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
101                 Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_VOLUME_FRAME, oe.getParts()[0]);
102             }
103             meta.setScreenVolumeFrame(ScreenVolumeFrame.RTN);
104 
105             // getScreenVolumeX() is NaN
106             try {
107                 meta.checkScreenVolumeConditions();
108                 Assertions.fail("an exception should have been thrown");
109             } catch (OrekitException oe) {
110                 Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
111                 Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_VOLUME_X, oe.getParts()[0]);
112             }
113             meta.setScreenVolumeX(1.);
114 
115             // getScreenVolumeY() is NaN
116             try {
117                 meta.checkScreenVolumeConditions();
118                 Assertions.fail("an exception should have been thrown");
119             } catch (OrekitException oe) {
120                 Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
121                 Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_VOLUME_Y, oe.getParts()[0]);
122             }
123             meta.setScreenVolumeY(1.);
124 
125             // getScreenVolumeZ() is NaN
126             try {
127                 meta.checkScreenVolumeConditions();
128                 Assertions.fail("an exception should have been thrown");
129             } catch (OrekitException oe) {
130                 Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
131                 Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_VOLUME_Z, oe.getParts()[0]);
132             }
133             meta.setScreenVolumeZ(1.);
134         }
135         
136         // Screen type PC or PC_MAX && getScreenPcThreshold() is Nan
137         meta.setScreenType(ScreenType.PC);
138         try {
139             meta.checkScreenVolumeConditions();
140             Assertions.fail("an exception should have been thrown");
141         } catch (OrekitException oe) {
142             Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
143             Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_PC_THRESHOLD, oe.getParts()[0]);
144         }
145         meta.setScreenType(ScreenType.PC_MAX);
146         try {
147             meta.checkScreenVolumeConditions();
148             Assertions.fail("an exception should have been thrown");
149         } catch (OrekitException oe) {
150             Assertions.assertEquals(OrekitMessages.CCSDS_MISSING_KEYWORD, oe.getSpecifier());
151             Assertions.assertEquals(CdmRelativeMetadataKey.SCREEN_PC_THRESHOLD, oe.getParts()[0]);
152         }
153         
154         // Case where it works
155         meta.setScreenPcThreshold(1.);
156         meta.checkScreenVolumeConditions();
157         meta.setScreenType(ScreenType.PC);
158         meta.checkScreenVolumeConditions();
159         
160         // Addendum: Test setCollisionPercentile when null
161         meta.setCollisionPercentile(null);
162         Assertions.assertEquals(null,  meta.getCollisionPercentile());
163     }
164 }