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.time;
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  import org.orekit.gnss.SatelliteSystem;
26  
27  public class GNSSDateTest {
28  
29      @Test
30      public void testFromWeekAndSecondsGPS() {
31          final DateComponents date = new DateComponents(2006, 8, 9);
32          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
33          doTestFromWeekAndSeconds(SatelliteSystem.GPS, date, time, 1387, 318677.0);
34      }
35  
36      @Test
37      public void testFromWeekAndSecondsGalileo() {
38          final DateComponents date = new DateComponents(2006, 8, 9);
39          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
40          doTestFromWeekAndSeconds(SatelliteSystem.GALILEO, date, time, 363, 318677.0);
41      }
42  
43      @Test
44      public void testFromWeekAndSecondsQZSS() {
45          final DateComponents date = new DateComponents(2006, 8, 9);
46          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
47          doTestFromWeekAndSeconds(SatelliteSystem.QZSS, date, time, 1387, 318677.0);
48      }
49  
50      @Test
51      public void testFromWeekAndSecondsBeidou() {
52          final DateComponents date = new DateComponents(2010, 2, 26);
53          final TimeComponents time = new TimeComponents(23, 15, new TimeOffset(12, 0));
54          doTestFromWeekAndSeconds(SatelliteSystem.BEIDOU, date, time, 216, 515713.0);
55      }
56  
57      @Test
58      public void testFromWeekAndSecondsNavIC() {
59          final DateComponents date = new DateComponents(2006, 8, 9);
60          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
61          doTestFromWeekAndSeconds(SatelliteSystem.NAVIC, date, time, 363, 318677.0);
62      }
63  
64      @Test
65      public void testFromWeekAndSecondsSBAS() {
66          final DateComponents date = new DateComponents(2006, 8, 9);
67          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
68          doTestFromWeekAndSeconds(SatelliteSystem.SBAS, date, time, 1387, 318677.0);
69      }
70  
71      private void doTestFromWeekAndSeconds(final SatelliteSystem system,
72                                          final DateComponents date, final TimeComponents time,
73                                          final int refWeek, final double refSeconds) {
74          GNSSDate GNSSDate  = new GNSSDate(refWeek, refSeconds, system);
75          AbsoluteDate ref  = new AbsoluteDate(date, time, utc);
76          Assertions.assertEquals(refWeek, GNSSDate.getWeekNumber());
77          Assertions.assertEquals(1000 * refSeconds, GNSSDate.getMilliInWeek(), 1.0e-15);
78          Assertions.assertEquals(refSeconds, GNSSDate.getSecondsInWeek(), 1.0e-15);
79          Assertions.assertEquals(0, GNSSDate.getDate().durationFrom(ref), 1.0e-15);
80      }
81  
82      @Test
83      public void testFromAbsoluteDateGPS() {
84          final DateComponents date = new DateComponents(2006, 8, 9);
85          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
86          doTestFromAbsoluteDate(SatelliteSystem.GPS, date, time, 1387, 318677000.0);
87      }
88  
89      @Test
90      public void testFromAbsoluteDateGalileo() {
91          final DateComponents date = new DateComponents(2006, 8, 9);
92          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
93          doTestFromAbsoluteDate(SatelliteSystem.GALILEO, date, time, 363, 318677000.0);
94      }
95  
96      @Test
97      public void testFromAbsoluteDateQZSS() {
98          final DateComponents date = new DateComponents(2006, 8, 9);
99          final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
100         doTestFromAbsoluteDate(SatelliteSystem.QZSS, date, time, 1387, 318677000.0);
101     }
102 
103     @Test
104     public void testFromAbsoluteDateBeidou() {
105         final DateComponents date = new DateComponents(2010, 2, 26);
106         final TimeComponents time = new TimeComponents(23, 15, new TimeOffset(12, 0));
107         doTestFromAbsoluteDate(SatelliteSystem.BEIDOU, date, time, 216, 515713000.0);
108     }
109 
110     @Test
111     public void testFromAbsoluteDateNavIC() {
112         final DateComponents date = new DateComponents(2006, 8, 9);
113         final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
114         doTestFromAbsoluteDate(SatelliteSystem.NAVIC, date, time, 363, 318677000.0);
115     }
116 
117     @Test
118     public void testFromAbsoluteDateSBAS() {
119         final DateComponents date = new DateComponents(2006, 8, 9);
120         final TimeComponents time = new TimeComponents(16, 31, new TimeOffset(3, 0));
121         doTestFromAbsoluteDate(SatelliteSystem.SBAS, date, time, 1387, 318677000.0);
122     }
123 
124     private void doTestFromAbsoluteDate(final SatelliteSystem system,
125                                         final DateComponents date, final TimeComponents time,
126                                         final int refWeek, final double refMilliSeconds) {
127         GNSSDate GNSSDate = new GNSSDate(new AbsoluteDate(date, time, utc), system);
128         Assertions.assertEquals(refWeek, GNSSDate.getWeekNumber());
129         Assertions.assertEquals(refMilliSeconds, GNSSDate.getMilliInWeek(), 1.0e-15);
130     }
131 
132     @Test
133     public void testZeroGPS() {
134         doTestZero(SatelliteSystem.GPS);
135     }
136 
137     @Test
138     public void testZeroGalileo() {
139         doTestZero(SatelliteSystem.GALILEO);
140     }
141 
142     @Test
143     public void testZeroQZSS() {
144         doTestZero(SatelliteSystem.QZSS);
145     }
146 
147     @Test
148     public void testZeroBeidou() {
149         doTestZero(SatelliteSystem.BEIDOU);
150     }
151 
152     @Test
153     public void testZeroNavIC() {
154         doTestZero(SatelliteSystem.NAVIC);
155     }
156 
157     @Test
158     public void testZeroSBAS() {
159         doTestZero(SatelliteSystem.SBAS);
160     }
161 
162     private void doTestZero(final SatelliteSystem system) {
163         AbsoluteDate epoch = null;
164         switch (system) {
165             case GPS:
166             case SBAS:
167                 epoch = AbsoluteDate.GPS_EPOCH;
168                 break;
169             case GALILEO:
170                 epoch = AbsoluteDate.GALILEO_EPOCH;
171                 break;
172             case QZSS:
173                 epoch = AbsoluteDate.QZSS_EPOCH;
174                 break;
175             case BEIDOU:
176                 epoch = AbsoluteDate.BEIDOU_EPOCH;
177                 break;
178             case NAVIC:
179                 epoch = AbsoluteDate.NAVIC_EPOCH;
180                 break;
181             default:
182                 break;
183         }
184         GNSSDate date = new GNSSDate(epoch, system);
185         Assertions.assertEquals(0, date.getWeekNumber());
186         Assertions.assertEquals(0.0, date.getMilliInWeek(), 1.0e-15);
187     }
188 
189     @Test
190     public void testZeroZeroGPS() {
191         GNSSDate.setRolloverReference(new DateComponents(DateComponents.GPS_EPOCH, 7 * 512));
192         GNSSDate date1 = new GNSSDate(0, 0.0, SatelliteSystem.GPS);
193         Assertions.assertEquals(0.0, date1.getDate().durationFrom(AbsoluteDate.GPS_EPOCH), 1.0e-15);
194         GNSSDate.setRolloverReference(new DateComponents(GNSSDate.getRolloverReference(), 1));
195         GNSSDate date2 = new GNSSDate(0, 0.0, SatelliteSystem.GPS);
196         Assertions.assertEquals(1024, date2.getWeekNumber());
197     }
198 
199     @Test
200     public void testZeroZeroGalileo() {
201         GNSSDate.setRolloverReference(new DateComponents(DateComponents.GALILEO_EPOCH, 7 * 2048));
202         GNSSDate date1 = new GNSSDate(0, 0.0, SatelliteSystem.GALILEO);
203         Assertions.assertEquals(0.0, date1.getDate().durationFrom(AbsoluteDate.GALILEO_EPOCH), 1.0e-15);
204         GNSSDate.setRolloverReference(new DateComponents(GNSSDate.getRolloverReference(), 1));
205         GNSSDate date2 = new GNSSDate(0, 0.0, SatelliteSystem.GALILEO);
206         Assertions.assertEquals(4096, date2.getWeekNumber());
207     }
208 
209     @Test
210     public void testZeroZeroQZSS() {
211         GNSSDate.setRolloverReference(new DateComponents(DateComponents.QZSS_EPOCH, 7 * 512));
212         GNSSDate date1 = new GNSSDate(0, 0.0, SatelliteSystem.QZSS);
213         Assertions.assertEquals(0.0, date1.getDate().durationFrom(AbsoluteDate.QZSS_EPOCH), 1.0e-15);
214         GNSSDate.setRolloverReference(new DateComponents(GNSSDate.getRolloverReference(), 1));
215         GNSSDate date2 = new GNSSDate(0, 0.0, SatelliteSystem.QZSS);
216         Assertions.assertEquals(1024, date2.getWeekNumber());
217     }
218 
219     @Test
220     public void testZeroZeroBeidou() {
221         GNSSDate.setRolloverReference(new DateComponents(DateComponents.BEIDOU_EPOCH, 7 * 4096));
222         GNSSDate date1 = new GNSSDate(0, 0.0, SatelliteSystem.BEIDOU);
223         Assertions.assertEquals(0.0, date1.getDate().durationFrom(AbsoluteDate.BEIDOU_EPOCH), 1.0e-15);
224         GNSSDate.setRolloverReference(new DateComponents(GNSSDate.getRolloverReference(), 1));
225         GNSSDate date2 = new GNSSDate(0, 0.0, SatelliteSystem.BEIDOU);
226         Assertions.assertEquals(8192, date2.getWeekNumber());
227     }
228 
229     @Test
230     public void testZeroZeroNavIC() {
231         GNSSDate.setRolloverReference(new DateComponents(DateComponents.NAVIC_EPOCH, 7 * 512));
232         GNSSDate date1 = new GNSSDate(0, 0.0, SatelliteSystem.NAVIC);
233         Assertions.assertEquals(0.0, date1.getDate().durationFrom(AbsoluteDate.NAVIC_EPOCH), 1.0e-15);
234         GNSSDate.setRolloverReference(new DateComponents(GNSSDate.getRolloverReference(), 1));
235         GNSSDate date2 = new GNSSDate(0, 0.0, SatelliteSystem.NAVIC);
236         Assertions.assertEquals(1024, date2.getWeekNumber());
237     }
238 
239     @Test
240     public void testZeroZeroSBAS() {
241         GNSSDate.setRolloverReference(new DateComponents(DateComponents.GPS_EPOCH, 7 * 512));
242         GNSSDate date1 = new GNSSDate(0, 0.0, SatelliteSystem.SBAS);
243         Assertions.assertEquals(0.0, date1.getDate().durationFrom(AbsoluteDate.GPS_EPOCH), 1.0e-15);
244         GNSSDate.setRolloverReference(new DateComponents(GNSSDate.getRolloverReference(), 1));
245         GNSSDate date2 = new GNSSDate(0, 0.0, SatelliteSystem.SBAS);
246         Assertions.assertEquals(1024, date2.getWeekNumber());
247     }
248 
249     @Test
250     public void testDefaultRolloverReference() {
251         Assertions.assertNull(GNSSDate.getRolloverReference());
252         GNSSDate date = new GNSSDate(305, 1.5e-3, SatelliteSystem.GPS);
253         // the default reference is extracted from last EOP entry
254         // which in this test comes from bulletin B 218, in the final values section
255         Assertions.assertEquals("2006-03-05", GNSSDate.getRolloverReference().toString());
256         Assertions.assertEquals(305 + 1024, date.getWeekNumber());
257     }
258 
259     @Test
260     public void testUserRolloverReference() {
261         GNSSDate.setRolloverReference(new DateComponents(DateComponents.GPS_EPOCH, 7 * (3 * 1024 + 512)));
262         GNSSDate date = new GNSSDate(305, 1.5e-3, SatelliteSystem.GPS);
263         Assertions.assertEquals("2048-09-13", GNSSDate.getRolloverReference().toString());
264         Assertions.assertEquals(305 + 3 * 1024, date.getWeekNumber());
265     }
266 
267     @Test
268     public void testBadSatelliteSystem() {
269         try {
270             @SuppressWarnings("unused")
271             GNSSDate date = new GNSSDate(new AbsoluteDate(), SatelliteSystem.GLONASS);
272             Assertions.fail("an exception should have been thrown");
273         } catch (OrekitException oe) {
274             Assertions.assertEquals(OrekitMessages.INVALID_SATELLITE_SYSTEM, oe.getSpecifier());
275         }
276     }
277 
278     @BeforeEach
279     public void setUp() {
280         Utils.setDataRoot("regular-data");
281         utc = TimeScalesFactory.getUTC();
282     }
283 
284     private TimeScale utc;
285 
286 }