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.frames;
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.errors.OrekitException;
24  import org.orekit.errors.OrekitMessages;
25  
26  import java.util.Arrays;
27  
28  public class OrphanFrameTest {
29  
30      @Test
31      public void testNotAttached() {
32  
33          OrphanFrame level0  = new OrphanFrame("l0");
34          OrphanFrame level1A = new OrphanFrame("l1A");
35          OrphanFrame level1B = new OrphanFrame("l1B");
36          OrphanFrame level2  = new OrphanFrame("l2");
37  
38          level0.addChild(level1A, Transform.IDENTITY, false);
39          level0.addChild(level1B, Transform.IDENTITY, false);
40          level1B.addChild(level2, Transform.IDENTITY, false);
41  
42          Assertions.assertEquals(2, level0.getChildren().size());
43          Assertions.assertEquals(0, level1A.getChildren().size());
44          Assertions.assertEquals(1, level1B.getChildren().size());
45          Assertions.assertEquals(0, level2.getChildren().size());
46  
47          for (OrphanFrame of : Arrays.asList(level0, level1A, level1B, level2)) {
48              try {
49                  of.getFrame();
50                  Assertions.fail("an exception should have been thrown");
51              } catch (OrekitException oe) {
52                  Assertions.assertEquals(OrekitMessages.FRAME_NOT_ATTACHED, oe.getSpecifier());
53              }
54          }
55  
56      }
57  
58      @Test
59      public void testAlreadyAttachedSubTree() {
60          OrphanFrame level0 = new OrphanFrame("l0");
61          OrphanFrame level1 = new OrphanFrame("l1");
62          level0.addChild(level1, Transform.IDENTITY, false);
63          try {
64              level0.addChild(level1, Transform.IDENTITY, false);
65              Assertions.fail("an exception should have been thrown");
66          } catch (OrekitException oe) {
67              Assertions.assertEquals(OrekitMessages.FRAME_ALREADY_ATTACHED, oe.getSpecifier());
68          }
69      }
70  
71      @Test
72      public void testAlreadyAttachedMainTree() {
73          OrphanFrame level0 = new OrphanFrame("l0");
74          level0.attachTo(FramesFactory.getGCRF(), Transform.IDENTITY, false);
75          try {
76              level0.attachTo(FramesFactory.getEME2000(), Transform.IDENTITY, false);
77              Assertions.fail("an exception should have been thrown");
78          } catch (OrekitException oe) {
79              Assertions.assertEquals(OrekitMessages.FRAME_ALREADY_ATTACHED, oe.getSpecifier());
80          }
81      }
82  
83      @Test
84      public void testSimpleUse() {
85          OrphanFrame level0  = new OrphanFrame("l0");
86          OrphanFrame level1A = new OrphanFrame("l1A");
87          OrphanFrame level1B = new OrphanFrame("l1B");
88          OrphanFrame level2  = new OrphanFrame("l2");
89          level0.addChild(level1A, Transform.IDENTITY, false);
90          level0.addChild(level1B, Transform.IDENTITY, false);
91          level1B.addChild(level2, Transform.IDENTITY, false);
92          level0.attachTo(FramesFactory.getGCRF(), Transform.IDENTITY, false);
93          Assertions.assertEquals(1, level0.getFrame().getDepth());
94          Assertions.assertEquals(level0.toString(), level0.getFrame().getName());
95          Assertions.assertEquals(2, level1A.getFrame().getDepth());
96          Assertions.assertEquals(level1A.toString(), level1A.getFrame().getName());
97          Assertions.assertEquals(2, level1B.getFrame().getDepth());
98          Assertions.assertEquals(level1B.toString(), level1B.getFrame().getName());
99          Assertions.assertEquals(3, level2.getFrame().getDepth());
100         Assertions.assertEquals(level2.toString(), level2.getFrame().getName());
101     }
102 
103     @Test
104     public void testLateAddition() {
105         OrphanFrame level0  = new OrphanFrame("l0");
106         OrphanFrame level1A = new OrphanFrame("l1A");
107         OrphanFrame level1B = new OrphanFrame("l1B");
108         OrphanFrame level2  = new OrphanFrame("l2");
109         level0.addChild(level1A, Transform.IDENTITY, false);
110         level0.addChild(level1B, Transform.IDENTITY, false);
111 
112         level0.attachTo(FramesFactory.getGCRF(), Transform.IDENTITY, false);
113         Assertions.assertEquals(1, level0.getFrame().getDepth());
114         Assertions.assertEquals(level0.toString(), level0.getFrame().getName());
115         Assertions.assertEquals(2, level1A.getFrame().getDepth());
116         Assertions.assertEquals(level1A.toString(), level1A.getFrame().getName());
117         Assertions.assertEquals(2, level1B.getFrame().getDepth());
118         Assertions.assertEquals(level1B.toString(), level1B.getFrame().getName());
119 
120         // level2 is not attached to anything yet
121         try {
122             level2.getFrame();
123             Assertions.fail("an exception should have been thrown");
124         } catch (OrekitException oe) {
125             Assertions.assertEquals(OrekitMessages.FRAME_NOT_ATTACHED, oe.getSpecifier());
126         }
127 
128         // adding a new child after the top level has been attached
129         level1B.addChild(level2, Transform.IDENTITY, false);
130 
131         // now level2 is attached to the main tree
132         Assertions.assertEquals(3, level2.getFrame().getDepth());
133         Assertions.assertEquals(level2.toString(), level2.getFrame().getName());
134 
135     }
136 
137     @BeforeEach
138     public void setUp() {
139         Utils.setDataRoot("compressed-data");
140     }
141 
142 }