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.adm.aem;
18  
19  import org.hipparchus.geometry.euclidean.threed.RotationOrder;
20  import org.junit.jupiter.api.Test;
21  import org.orekit.Utils;
22  import org.orekit.data.DataContext;
23  import org.orekit.files.ccsds.definitions.Units;
24  import org.orekit.files.ccsds.ndm.AbstractWriterTest;
25  import org.orekit.files.ccsds.ndm.ParsedUnitsBehavior;
26  import org.orekit.files.ccsds.ndm.ParserBuilder;
27  import org.orekit.files.ccsds.ndm.WriterBuilder;
28  import org.orekit.files.ccsds.ndm.adm.AdmHeader;
29  import org.orekit.files.ccsds.utils.generation.XmlGenerator;
30  import org.orekit.time.AbsoluteDate;
31  import org.orekit.utils.IERSConventions;
32  import org.orekit.utils.units.Unit;
33  
34  import java.io.IOException;
35  
36  import static org.mockito.Mockito.mock;
37  import static org.mockito.Mockito.reset;
38  import static org.mockito.Mockito.verify;
39  
40  public class AemWriterTest extends AbstractWriterTest<AdmHeader, AemSegment, Aem> {
41  
42      protected AemParser getParser() {
43          return new ParserBuilder().
44                 withParsedUnitsBehavior(ParsedUnitsBehavior.STRICT_COMPLIANCE).
45                 buildAemParser();
46      }
47  
48      protected AemWriter getWriter() {
49          return new WriterBuilder().buildAemWriter();
50      }
51  
52      @Test
53      public void testWriteExample01() {
54          doTest("/ccsds/adm/aem/AEMExample01.txt");
55      }
56  
57      @Test
58      public void testWriteExample02() {
59          doTest("/ccsds/adm/aem/AEMExample02.txt");
60      }
61  
62      @Test
63      public void testWriteKvnExample03() {
64          doTest("/ccsds/adm/aem/AEMExample03.txt");
65      }
66  
67      @Test
68      public void testWriteXmlExample03() {
69          doTest("/ccsds/adm/aem/AEMExample03.xml");
70      }
71  
72      @Test
73      public void testWriteExample04() {
74          doTest("/ccsds/adm/aem/AEMExample04.txt");
75      }
76  
77      @Test
78      public void testWriteExample05() {
79          doTest("/ccsds/adm/aem/AEMExample05.txt");
80      }
81  
82      @Test
83      public void testWriteExample06a() {
84          doTest("/ccsds/adm/aem/AEMExample06a.txt");
85      }
86  
87      @Test
88      public void testWriteExample06b() {
89          doTest("/ccsds/adm/aem/AEMExample06b.txt");
90      }
91  
92      @Test
93      public void testWriteExample07() {
94          doTest("/ccsds/adm/aem/AEMExample07.txt");
95      }
96  
97      @Test
98      public void testWriteExample08() {
99          doTest("/ccsds/adm/aem/AEMExample08.txt");
100     }
101 
102     @Test
103     public void testWriteExample09() {
104         doTest("/ccsds/adm/aem/AEMExample09.txt");
105     }
106 
107     @Test
108     public void testWriteExample10() {
109         doTest("/ccsds/adm/aem/AEMExample10.txt");
110     }
111 
112     @Test
113     public void testWriteExample11() {
114         doTest("/ccsds/adm/aem/AEMExample11.xml");
115     }
116 
117     @Test
118     public void testWriteExample12() {
119         doTest("/ccsds/adm/aem/AEMExample12.txt");
120     }
121 
122     @Test
123     public void testWriteExample13() {
124         doTest("/ccsds/adm/aem/AEMExample13.xml");
125     }
126 
127     @Test
128     public void testWriteExample14() {
129         doTest("/ccsds/adm/aem/AEMExample14.txt");
130     }
131 
132     @Test
133     public void testWriteExample15() {
134         doTest("/ccsds/adm/aem/AEMExample15.txt");
135     }
136 
137     @Test
138     public void testWriteExample16() {
139         doTest("/ccsds/adm/aem/AEMExample16.txt");
140     }
141 
142     @Test
143     public void testWriteExample17() {
144         doTest("/ccsds/adm/aem/AEMExample17.txt");
145     }
146 
147     @Test
148     // This test was added to increase overall conditions coverage in the scope of issue 1453
149     public void testIssue1453() throws IOException {
150         // GIVEN
151         // Load orekit data
152         Utils.setDataRoot("regular-data");
153 
154         // Create writer
155         final AemWriter writer = new AemWriter(IERSConventions.IERS_2010, DataContext.getDefault(), null);
156 
157         // Create mock xml generator
158         final XmlGenerator mockXmlGenerator = mock(XmlGenerator.class);
159 
160         // Create mock epoch
161         final AbsoluteDate mockAbsoluteDate = mock(AbsoluteDate.class);
162 
163         // Create fake data
164         final String[] data = new String[] { "1", "2", "3", "4", "5", "6", "7", "8"};
165 
166         // WHEN & THEN
167         // Write quaternion method
168         writer.writeQuaternion(mockXmlGenerator, 1, true, mockAbsoluteDate, data);
169         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC.name(), data[0], Unit.ONE, false);
170         reset(mockXmlGenerator);
171 
172         writer.writeQuaternion(mockXmlGenerator, 1, false, mockAbsoluteDate, data);
173         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC.name(), data[3], Unit.ONE, false);
174         reset(mockXmlGenerator);
175 
176         // Write quaternion derivatives method
177         writer.writeQuaternionDerivative(mockXmlGenerator, 1, true, mockAbsoluteDate, data);
178         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC.name(), data[0], Unit.ONE, true);
179         verify(mockXmlGenerator).enterSection(AttitudeEntryKey.quaternionRate.name());
180         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC_DOT.name(), data[4], Units.ONE_PER_S, true);
181         reset(mockXmlGenerator);
182 
183         writer.writeQuaternionDerivative(mockXmlGenerator, 1, false, mockAbsoluteDate, data);
184         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC.name(), data[3], Unit.ONE, true);
185         verify(mockXmlGenerator).enterSection(AttitudeEntryKey.quaternionRate.name());
186         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC_DOT.name(), data[7], Units.ONE_PER_S, true);
187         reset(mockXmlGenerator);
188 
189         // Write quaternion euler rates method
190         writer.writeQuaternionEulerRates(mockXmlGenerator, true, RotationOrder.XYZ, mockAbsoluteDate, data);
191         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC.name(), data[0], Unit.ONE, true);
192         reset(mockXmlGenerator);
193 
194         writer.writeQuaternionEulerRates(mockXmlGenerator, false, RotationOrder.XYZ, mockAbsoluteDate, data);
195         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.QC.name(), data[3], Unit.ONE, true);
196         reset(mockXmlGenerator);
197 
198         // Write euler angle method
199         writer.writeEulerAngle(mockXmlGenerator, 2, RotationOrder.XYZ, mockAbsoluteDate, data);
200         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.ANGLE_1.name(), data[0], Unit.DEGREE, true);
201         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.ANGLE_2.name(), data[1], Unit.DEGREE, true);
202         verify(mockXmlGenerator).writeEntry(AttitudeEntryKey.ANGLE_3.name(), data[2], Unit.DEGREE, true);
203     }
204 }