1   /* Copyright 2002-2022 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.gnss.navigation;
18  
19  import java.io.IOException;
20  import java.net.URISyntaxException;
21  
22  import org.hipparchus.util.FastMath;
23  import org.junit.Assert;
24  import org.junit.Before;
25  import org.junit.Test;
26  import org.orekit.Utils;
27  import org.orekit.data.DataSource;
28  import org.orekit.errors.OrekitException;
29  import org.orekit.errors.OrekitMessages;
30  import org.orekit.gnss.SatelliteSystem;
31  import org.orekit.propagation.analytical.gnss.data.BeidouNavigationMessage;
32  import org.orekit.propagation.analytical.gnss.data.GLONASSNavigationMessage;
33  import org.orekit.propagation.analytical.gnss.data.GPSNavigationMessage;
34  import org.orekit.propagation.analytical.gnss.data.GalileoNavigationMessage;
35  import org.orekit.propagation.analytical.gnss.data.IRNSSNavigationMessage;
36  import org.orekit.propagation.analytical.gnss.data.QZSSNavigationMessage;
37  import org.orekit.propagation.analytical.gnss.data.SBASNavigationMessage;
38  import org.orekit.time.AbsoluteDate;
39  import org.orekit.time.TimeScalesFactory;
40  
41  public class NavigationFileParserTest {
42  
43      @Before
44      public void setUp() {
45          Utils.setDataRoot("regular-data");
46      }
47  
48      @Test
49      public void testGpsRinex301() throws URISyntaxException, IOException {
50  
51          // Parse file
52          final String ex = "/gnss/navigation/Example_GPS_Rinex301.n";
53          final RinexNavigation file = new RinexNavigationParser().
54                          parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
55  
56          // Verify Header
57          Assert.assertEquals(3.01,                file.getFormatVersion(), Double.MIN_VALUE);
58          Assert.assertEquals("N",                 file.getFileType());
59          Assert.assertEquals(SatelliteSystem.GPS, file.getSatelliteSystem());
60          Assert.assertEquals("XXRINEXN V3",       file.getProgramName());
61          Assert.assertEquals("AIUB",              file.getAgencyName());
62          Assert.assertEquals("19990903",          file.getCreationDateString());
63          Assert.assertEquals("152236",            file.getCreationTimeString());
64          Assert.assertEquals("UTC",               file.getCreationTimeZoneString());
65          Assert.assertEquals(0.0, file.getCreationDate().durationFrom(new AbsoluteDate(1999, 9, 3, 15, 22, 36.0, TimeScalesFactory.getUTC())), 0.0);
66          Assert.assertEquals("GPS",               file.getIonosphericCorrectionType());
67          Assert.assertEquals(0.1676e-07,          file.getKlobucharAlpha()[0], Double.MIN_VALUE);
68          Assert.assertEquals(0.2235e-07,          file.getKlobucharAlpha()[1], Double.MIN_VALUE);
69          Assert.assertEquals(0.1192e-06,          file.getKlobucharAlpha()[2], Double.MIN_VALUE);
70          Assert.assertEquals(0.1192e-06,          file.getKlobucharAlpha()[3], Double.MIN_VALUE);
71          Assert.assertEquals(0.1208e+06,          file.getKlobucharBeta()[0],  Double.MIN_VALUE);
72          Assert.assertEquals(0.1310e+06,          file.getKlobucharBeta()[1],  Double.MIN_VALUE);
73          Assert.assertEquals(-0.1310e+06,         file.getKlobucharBeta()[2],  Double.MIN_VALUE);
74          Assert.assertEquals(-0.1966e+06,         file.getKlobucharBeta()[3],  Double.MIN_VALUE);
75          Assert.assertEquals("GPUT", file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionType());
76          Assert.assertEquals(0.1331791282e-06,    file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA0(), Double.MIN_VALUE);
77          Assert.assertEquals(0.107469589e-12,     file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA1(), Double.MIN_VALUE);
78          Assert.assertEquals(552960,              file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionSecOfWeek());
79          Assert.assertEquals(1025,                file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionWeekNumber());
80          Assert.assertEquals("EXAMPLE OF VERSION 3.00 FORMAT", file.getComments());
81          Assert.assertEquals(13, file.getNumberOfLeapSeconds());
82  
83          // Verify data
84          Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
85          Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
86          Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
87          Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
88          Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
89          Assert.assertEquals(0, file.getSBASNavigationMessages().size());
90          Assert.assertEquals(2, file.getGPSNavigationMessages().size());
91  
92          final GPSNavigationMessage gps = file.getGPSNavigationMessages("G13").get(0);
93          Assert.assertEquals(0.0, gps.getEpochToc().durationFrom(new AbsoluteDate(1999, 9, 2, 19, 0, 0, TimeScalesFactory.getGPS())), Double.MIN_VALUE);
94          Assert.assertEquals(0.490025617182e-03,  gps.getAf0(), 1.0e-15);
95          Assert.assertEquals(0.204636307899e-11,  gps.getAf1(), 1.0e-15);
96          Assert.assertEquals(0.000000000000e+00,  gps.getAf2(), 1.0e-15);
97          Assert.assertEquals(133,                 gps.getIODE());
98          Assert.assertEquals(-0.963125000000e+02, gps.getCrs(), 1.0e-15);
99          Assert.assertEquals(0.292961152146e+01,  gps.getM0(), 1.0e-15);
100         Assert.assertEquals(-0.498816370964e-05, gps.getCuc(), 1.0e-15);
101         Assert.assertEquals(0.200239347760e-02,  gps.getE(), 1.0e-15);
102         Assert.assertEquals(0.928156077862e-05,  gps.getCus(), 1.0e-15);
103         Assert.assertEquals(0.515328476143e+04,  FastMath.sqrt(gps.getSma()), 1.0e-15);
104         Assert.assertEquals(0.414000000000e+06,  gps.getTime(), 1.0e-15);
105         Assert.assertEquals(-0.279396772385e-07, gps.getCic(), 1.0e-15);
106         Assert.assertEquals(0.243031939942e+01,  gps.getOmega0(), 1.0e-15);
107         Assert.assertEquals(-0.558793544769e-07, gps.getCis(), 1.0e-15);
108         Assert.assertEquals(0.110192796930e+01,  gps.getI0(), 1.0e-15);
109         Assert.assertEquals(0.271187500000e+03,  gps.getCrc(), 1.0e-15);
110         Assert.assertEquals(-0.232757915425e+01, gps.getPa(), 1.0e-15);
111         Assert.assertEquals(-0.619632953057e-08, gps.getOmegaDot(), 1.0e-15);
112         Assert.assertEquals(-0.785747015231e-11, gps.getIDot(), 1.0e-15);
113         Assert.assertEquals(1025,                gps.getWeek());
114         Assert.assertEquals(0.000000000000e+00,  gps.getSvAccuracy(), 1.0e-15);
115         Assert.assertEquals(0.000000000000e+00,  gps.getSvHealth(), 1.0e-15);
116         Assert.assertEquals(0.000000000000e+00,  gps.getTGD(), 1.0e-15);
117         Assert.assertEquals(389,                 gps.getIODC());
118 
119     }
120 
121     @Test
122     public void testSBASRinex301() throws URISyntaxException, IOException {
123 
124         // Parse file
125         final String ex = "/gnss/navigation/Example_SBAS_Rinex301.n";
126         final RinexNavigation file = new RinexNavigationParser().
127                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
128 
129         // Verify Header
130         Assert.assertEquals(3.01,                    file.getFormatVersion(), Double.MIN_VALUE);
131         Assert.assertEquals("N",                     file.getFileType());
132         Assert.assertEquals(SatelliteSystem.SBAS,    file.getSatelliteSystem());
133         Assert.assertEquals("sbf2rin-9.3.3",         file.getProgramName());
134         Assert.assertEquals("",                      file.getAgencyName());
135         Assert.assertEquals("20150106",              file.getCreationDateString());
136         Assert.assertEquals("000809",                file.getCreationTimeString());
137         Assert.assertEquals("LCL",                   file.getCreationTimeZoneString());
138 
139         // Verify data
140         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
141         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
142         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
143         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
144         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
145         Assert.assertEquals(2, file.getSBASNavigationMessages().size());
146         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
147 
148         final SBASNavigationMessage sbas = file.getSBASNavigationMessages("S27").get(0);
149         Assert.assertEquals(0.0, sbas.getEpochToc().durationFrom(new AbsoluteDate(2015, 1, 4, 23, 58, 56.0, TimeScalesFactory.getGPS())), Double.MIN_VALUE);
150         Assert.assertEquals(2.980232238770E-08,  sbas.getAGf0(), 1.0e-10);
151         Assert.assertEquals(1.182343112305E-11,  sbas.getAGf1(), 1.0e-10);
152         Assert.assertEquals(8.631300000000E+04,  sbas.getTime(), 1.0e-10);
153         Assert.assertEquals(2420.415392000E+04,  sbas.getX(), 1.0e-10);
154         Assert.assertEquals(-3450.000000000E-04, sbas.getXDot(), 1.0e-10);
155         Assert.assertEquals(-3375.000000000E-07, sbas.getXDotDot(), 1.0e-10);
156         Assert.assertEquals(3.100000000000E+01,  sbas.getHealth(), 1.0e-10);
157         Assert.assertEquals(3453.707432000E+04,  sbas.getY(), 1.0e-10);
158         Assert.assertEquals(-2950.625000000E-03, sbas.getYDot(), 1.0e-10);
159         Assert.assertEquals(1750.000000000E-07,  sbas.getYDotDot(), 1.0e-10);
160         Assert.assertEquals(4.096000000000E+03,  sbas.getURA(), 1.0e-10);
161         Assert.assertEquals(-3269.960000000E+01, sbas.getZ(), 1.0e-10);
162         Assert.assertEquals(-2132.000000000E-03, sbas.getZDot(), 1.0e-10);
163         Assert.assertEquals(1875.000000000E-07,  sbas.getZDotDot(), 1.0e-10);
164         Assert.assertEquals(192,                 sbas.getIODN(), 1.0e-10);
165 
166     }
167 
168     @Test
169     public void testBeidouRinex302() throws URISyntaxException, IOException {
170 
171         final String ex = "/gnss/navigation/Example_Beidou_Rinex302.n";
172         final RinexNavigation file = new RinexNavigationParser().
173                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
174 
175         // Verify Header
176         Assert.assertEquals(3.02,                    file.getFormatVersion(), Double.MIN_VALUE);
177         Assert.assertEquals("N",                     file.getFileType());
178         Assert.assertEquals(SatelliteSystem.BEIDOU,  file.getSatelliteSystem());
179         Assert.assertEquals("Converto v3.5.5",       file.getProgramName());
180         Assert.assertEquals("IGN",                   file.getAgencyName());
181         Assert.assertEquals("20210224",              file.getCreationDateString());
182         Assert.assertEquals("012052",                file.getCreationTimeString());
183         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
184         Assert.assertEquals(4,                       file.getNumberOfLeapSeconds());
185 
186         // Verify data
187         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
188         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
189         Assert.assertEquals(2, file.getBeidouNavigationMessages().size());
190         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
191         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
192         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
193         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
194 
195         final BeidouNavigationMessage bdt = file.getBeidouNavigationMessages("C02").get(0);
196         Assert.assertEquals(0.0, bdt.getEpochToc().durationFrom(new AbsoluteDate(2021, 2, 22, 22, 0, 0, TimeScalesFactory.getBDT())), Double.MIN_VALUE);
197         Assert.assertEquals(4.916836041957e-04,  bdt.getAf0(), 1.0e-15);
198         Assert.assertEquals(-3.058442388237e-11, bdt.getAf1(), 1.0e-15);
199         Assert.assertEquals(0.000000000000e+00,  bdt.getAf2(), 1.0e-15);
200         Assert.assertEquals(1,                   bdt.getAODE());
201         Assert.assertEquals(2.775156250000e+02,  bdt.getCrs(), 1.0e-15);
202         Assert.assertEquals(-2.539159755499e+00, bdt.getM0(), 1.0e-15);
203         Assert.assertEquals(9.234994649887e-06,  bdt.getCuc(), 1.0e-15);
204         Assert.assertEquals(9.814361110330e-04,  bdt.getE(), 1.0e-15);
205         Assert.assertEquals(9.856652468443e-06,  bdt.getCus(), 1.0e-15);
206         Assert.assertEquals(6.493364431381e+03,  FastMath.sqrt(bdt.getSma()), 1.0e-15);
207         Assert.assertEquals(1.656000000000e+05,  bdt.getTime(), 1.0e-15);
208         Assert.assertEquals(8.055940270424e-08,  bdt.getCic(), 1.0e-15);
209         Assert.assertEquals(2.930216013841e+00,  bdt.getOmega0(), 1.0e-15);
210         Assert.assertEquals(-1.355074346066e-07, bdt.getCis(), 1.0e-15);
211         Assert.assertEquals(6.617987281734e-02,  bdt.getI0(), 1.0e-15);
212         Assert.assertEquals(-2.970000000000e+02, bdt.getCrc(), 1.0e-15);
213         Assert.assertEquals(5.859907097566e-01,  bdt.getPa(), 1.0e-15);
214         Assert.assertEquals(4.416612541069e-09,  bdt.getOmegaDot(), 1.0e-15);
215         Assert.assertEquals(-4.628764235181e-10, bdt.getIDot(), 1.0e-15);
216         Assert.assertEquals(790,                 bdt.getWeek());
217         Assert.assertEquals(2.000000000000e+00,  bdt.getSvAccuracy(), 1.0e-15);
218         Assert.assertEquals(1.500000000000e-09,  bdt.getTGD1(), 1.0e-15);
219         Assert.assertEquals(-1.370000000000e-08, bdt.getTGD2(), 1.0e-15);
220 
221     }
222 
223     @Test
224     public void testGalileoRinex302() throws URISyntaxException, IOException {
225 
226         // Parse file
227         final String ex = "/gnss/navigation/Example_Galileo_Rinex302.n";
228         final RinexNavigation file = new RinexNavigationParser().
229                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
230 
231         // Verify Header
232         Assert.assertEquals(3.02,                    file.getFormatVersion(), Double.MIN_VALUE);
233         Assert.assertEquals("N",                     file.getFileType());
234         Assert.assertEquals(SatelliteSystem.GALILEO, file.getSatelliteSystem());
235         Assert.assertEquals("sbf2rin-10.2.0",        file.getProgramName());
236         Assert.assertEquals("",                      file.getAgencyName());
237         Assert.assertEquals("20160428",              file.getCreationDateString());
238         Assert.assertEquals("003637",                file.getCreationTimeString());
239         Assert.assertEquals("LCL",                   file.getCreationTimeZoneString());
240         Assert.assertEquals("GAL",                   file.getIonosphericCorrectionType());
241         Assert.assertEquals(3.5500E+01,              file.getNeQuickAlpha()[0], Double.MIN_VALUE);
242         Assert.assertEquals(-2.3438E-02,             file.getNeQuickAlpha()[1], Double.MIN_VALUE);
243         Assert.assertEquals(1.6632E-02,              file.getNeQuickAlpha()[2], Double.MIN_VALUE);
244         Assert.assertEquals(0.0000E+00,              file.getNeQuickAlpha()[3], Double.MIN_VALUE);
245         Assert.assertEquals("GPGA", file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionType());
246         Assert.assertEquals("GAUT", file.getTimeSystemCorrections().get(1).getTimeSystemCorrectionType());
247         Assert.assertEquals(-2.9103830457E-11,       file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA0(), Double.MIN_VALUE);
248         Assert.assertEquals(-4.440892099E-16,        file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA1(), Double.MIN_VALUE);
249         Assert.assertEquals(918000,                  file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionSecOfWeek());
250         Assert.assertEquals(1919,                    file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionWeekNumber());
251         Assert.assertEquals("", file.getComments());
252         Assert.assertEquals(17, file.getNumberOfLeapSeconds());
253 
254         // Verify data
255         Assert.assertEquals(2, file.getGalileoNavigationMessages().size());
256         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
257         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
258         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
259         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
260         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
261         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
262 
263         final GalileoNavigationMessage gal = file.getGalileoNavigationMessages("E08").get(3);
264         Assert.assertEquals(0.0, gal.getEpochToc().durationFrom(new AbsoluteDate(2016, 4, 26, 5, 50, 0, TimeScalesFactory.getGST())), Double.MIN_VALUE);
265         Assert.assertEquals(1.646681921557E-03,  gal.getAf0(), 1.0e-15);
266         Assert.assertEquals(3.988276375821E-10,  gal.getAf1(), 1.0e-15);
267         Assert.assertEquals(0.000000000000e+00,  gal.getAf2(), 1.0e-15);
268         Assert.assertEquals(285,                 gal.getIODNav());
269         Assert.assertEquals(-1.550000000000E+01, gal.getCrs(), 1.0e-15);
270         Assert.assertEquals(-1.881713322719E+00, gal.getM0(), 1.0e-15);
271         Assert.assertEquals(-9.220093488693E-07, gal.getCuc(), 1.0e-15);
272         Assert.assertEquals(2.031255280599E-04,  gal.getE(), 1.0e-15);
273         Assert.assertEquals(8.771196007729E-06,  gal.getCus(), 1.0e-15);
274         Assert.assertEquals(5.440611787796E+03,  FastMath.sqrt(gal.getSma()), 1.0e-15);
275         Assert.assertEquals(1.938000000000E+05,  gal.getTime(), 1.0e-15);
276         Assert.assertEquals(7.450580596924E-09,  gal.getCic(), 1.0e-15);
277         Assert.assertEquals(-1.589621838359E-01, gal.getOmega0(), 1.0e-15);
278         Assert.assertEquals(5.401670932770E-08,  gal.getCis(), 1.0e-15);
279         Assert.assertEquals(9.594902351453E-01,  gal.getI0(), 1.0e-15);
280         Assert.assertEquals(1.494687500000E+02,  gal.getCrc(), 1.0e-15);
281         Assert.assertEquals(-1.602015041031E+00, gal.getPa(), 1.0e-15);
282         Assert.assertEquals(-5.460941755858E-09, gal.getOmegaDot(), 1.0e-15);
283         Assert.assertEquals(-6.350264514006E-10, gal.getIDot(), 1.0e-15);
284         Assert.assertEquals(1894,                gal.getWeek());
285         Assert.assertEquals(3.120000000000E+00,  gal.getSisa(), 1.0e-15);
286         Assert.assertEquals(0.000000000000e+00,  gal.getSvHealth(), 1.0e-15);
287         Assert.assertEquals(-7.450580596924E-09, gal.getBGDE1E5a(), 1.0e-15);
288         Assert.assertEquals(0.000000000000E+00,  gal.getBGDE5bE1(), 1.0e-15);
289 
290     }
291 
292     @Test
293     public void testQZSSRinex302() throws URISyntaxException, IOException {
294 
295         final String ex = "/gnss/navigation/Example_QZSS_Rinex302.n";
296         final RinexNavigation file = new RinexNavigationParser().
297                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
298 
299         // Verify Header
300         Assert.assertEquals(3.02,                    file.getFormatVersion(), Double.MIN_VALUE);
301         Assert.assertEquals("N",                     file.getFileType());
302         Assert.assertEquals(SatelliteSystem.QZSS,    file.getSatelliteSystem());
303         Assert.assertEquals("NetR9 5.45",            file.getProgramName());
304         Assert.assertEquals("Receiver Operator",     file.getAgencyName());
305         Assert.assertEquals("20200609",              file.getCreationDateString());
306         Assert.assertEquals("000000",                file.getCreationTimeString());
307         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
308         Assert.assertEquals("QZS",                   file.getIonosphericCorrectionType());
309         Assert.assertEquals(0.5588e-08,              file.getKlobucharAlpha()[0], Double.MIN_VALUE);
310         Assert.assertEquals(0.7451e-08,              file.getKlobucharAlpha()[1], Double.MIN_VALUE);
311         Assert.assertEquals(-0.4768e-06,             file.getKlobucharAlpha()[2], Double.MIN_VALUE);
312         Assert.assertEquals(-0.1013e-05,             file.getKlobucharAlpha()[3], Double.MIN_VALUE);
313         Assert.assertEquals(0.8602e+05,              file.getKlobucharBeta()[0],  Double.MIN_VALUE);
314         Assert.assertEquals(-0.4096e+06,             file.getKlobucharBeta()[1],  Double.MIN_VALUE);
315         Assert.assertEquals(-0.8389e+07,             file.getKlobucharBeta()[2],  Double.MIN_VALUE);
316         Assert.assertEquals(-0.8389e+07,             file.getKlobucharBeta()[3],  Double.MIN_VALUE);
317         Assert.assertEquals("QZUT", file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionType());
318         Assert.assertEquals(0.0,                     file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA0(), Double.MIN_VALUE);
319         Assert.assertEquals(0.0,                     file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA1(), Double.MIN_VALUE);
320         Assert.assertEquals(356352,                  file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionSecOfWeek());
321         Assert.assertEquals(2109,                    file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionWeekNumber());
322         Assert.assertEquals("",                      file.getComments());
323         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
324 
325         // Verify data
326         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
327         Assert.assertEquals(3, file.getQZSSNavigationMessages().size());
328         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
329         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
330         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
331         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
332         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
333 
334         final QZSSNavigationMessage qzs = file.getQZSSNavigationMessages("J07").get(0);
335         Assert.assertEquals(0.0, qzs.getEpochToc().durationFrom(new AbsoluteDate(2020, 6, 9, 0, 0, 0, TimeScalesFactory.getQZSS())), Double.MIN_VALUE);
336         Assert.assertEquals(-0.214204192162e-07, qzs.getAf0(), 1.0e-15);
337         Assert.assertEquals(0.000000000000e+00,  qzs.getAf1(), 1.0e-15);
338         Assert.assertEquals(0.000000000000e+00,  qzs.getAf2(), 1.0e-15);
339         Assert.assertEquals(189,                 qzs.getIODE());
340         Assert.assertEquals(-0.580312500000e+03, qzs.getCrs(), 1.0e-15);
341         Assert.assertEquals(-0.104204506497e+01, qzs.getM0(), 1.0e-15);
342         Assert.assertEquals(-0.190474092960e-04, qzs.getCuc(), 1.0e-15);
343         Assert.assertEquals(0.140047399327e-03,  qzs.getE(), 1.0e-15);
344         Assert.assertEquals(0.936537981033e-05,  qzs.getCus(), 1.0e-15);
345         Assert.assertEquals(0.649355915070e+04,  FastMath.sqrt(qzs.getSma()), 1.0e-15);
346         Assert.assertEquals(0.172800000000e+06,  qzs.getTime(), 1.0e-15);
347         Assert.assertEquals(-0.241957604885e-05, qzs.getCic(), 1.0e-15);
348         Assert.assertEquals(-0.102838327972e-01, qzs.getOmega0(), 1.0e-15);
349         Assert.assertEquals(0.251457095146e-06,  qzs.getCis(), 1.0e-15);
350         Assert.assertEquals(0.107314257498e-02,  qzs.getI0(), 1.0e-15);
351         Assert.assertEquals(-0.291156250000e+03, qzs.getCrc(), 1.0e-15);
352         Assert.assertEquals(-0.298090621453e+01, qzs.getPa(), 1.0e-15);
353         Assert.assertEquals(0.116790579082e-08,  qzs.getOmegaDot(), 1.0e-15);
354         Assert.assertEquals(0.000000000000e+00,  qzs.getIDot(), 1.0e-15);
355         Assert.assertEquals(2109,                qzs.getWeek());
356         Assert.assertEquals(0.280000000000e+01,  qzs.getSvAccuracy(), 1.0e-15);
357         Assert.assertEquals(0.620000000000e+02,  qzs.getSvHealth(), 1.0e-15);
358         Assert.assertEquals(-0.605359673500e-08, qzs.getTGD(), 1.0e-15);
359         Assert.assertEquals(957,                 qzs.getIODC(), 1.0e-15);
360 
361     }
362 
363     @Test
364     public void testGLONASSRinex303() throws URISyntaxException, IOException {
365 
366         // Parse file
367         final String ex = "/gnss/navigation/Example_Glonass_Rinex303.n";
368         final RinexNavigation file = new RinexNavigationParser().
369                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
370 
371         // Verify Header
372         Assert.assertEquals(3.03,                    file.getFormatVersion(), Double.MIN_VALUE);
373         Assert.assertEquals("N",                     file.getFileType());
374         Assert.assertEquals(SatelliteSystem.GLONASS, file.getSatelliteSystem());
375         Assert.assertEquals("GR25 V4.30",            file.getProgramName());
376         Assert.assertEquals("Institute of Astrono",  file.getAgencyName());
377         Assert.assertEquals("20210217",              file.getCreationDateString());
378         Assert.assertEquals("235947",                file.getCreationTimeString());
379         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
380         Assert.assertEquals("GLUT", file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionType());
381         Assert.assertEquals(6.0535967350e-09,        file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA0(), Double.MIN_VALUE);
382         Assert.assertEquals(0.000000000e+00,         file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA1(), Double.MIN_VALUE);
383         Assert.assertEquals(0,                       file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionSecOfWeek());
384         Assert.assertEquals(0,                       file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionWeekNumber());
385         Assert.assertEquals("",                      file.getComments());
386         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
387 
388         // Verify data
389         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
390         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
391         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
392         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
393         Assert.assertEquals(3, file.getGlonassNavigationMessages().size());
394         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
395         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
396 
397         final GLONASSNavigationMessage glo = file.getGlonassNavigationMessages("R02").get(0);
398         Assert.assertEquals(0.0, glo.getEpochToc().durationFrom(new AbsoluteDate(2021, 2, 17, 23, 45, 0.0, TimeScalesFactory.getGPS())), Double.MIN_VALUE);
399         Assert.assertEquals(-4.674419760704e-04, glo.getTN(), 1.0e-10);
400         Assert.assertEquals(9.094947017729e-13,  glo.getGammaN(), 1.0e-10);
401         Assert.assertEquals(84600.0,             glo.getTime(), 1.0e-10);
402         Assert.assertEquals(-1252.090332031e+04, glo.getX(), 1.0e-10);
403         Assert.assertEquals(-2661.552429199e+00, glo.getXDot(), 1.0e-10);
404         Assert.assertEquals(0.000000000000e+00,  glo.getXDotDot(), 1.0e-10);
405         Assert.assertEquals(0.000000000000e+00,  glo.getHealth(), 1.0e-10);
406         Assert.assertEquals(1045.030761719e+04,  glo.getY(), 1.0e-10);
407         Assert.assertEquals(3342.580795288e-01,  glo.getYDot(), 1.0e-10);
408         Assert.assertEquals(0.000000000000e+00,  glo.getYDotDot(), 1.0e-10);
409         Assert.assertEquals(-4,                  glo.getFrequencyNumber());
410         Assert.assertEquals(1963.127978516e+04,  glo.getZ(), 1.0e-10);
411         Assert.assertEquals(-1884.816169739e+00, glo.getZDot(), 1.0e-10);
412         Assert.assertEquals(-1862.645149231e-09, glo.getZDotDot(), 1.0e-10);
413 
414     }
415 
416     @Test
417     public void testIRNSSRinex303() throws URISyntaxException, IOException {
418 
419         final String ex = "/gnss/navigation/Example_IRNSS_Rinex303.n";
420         final RinexNavigation file = new RinexNavigationParser().
421                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
422 
423         // Verify Header
424         Assert.assertEquals(3.03,                    file.getFormatVersion(), Double.MIN_VALUE);
425         Assert.assertEquals("N",                     file.getFileType());
426         Assert.assertEquals(SatelliteSystem.IRNSS,   file.getSatelliteSystem());
427         Assert.assertEquals("JPS2RIN v.2.0.168",     file.getProgramName());
428         Assert.assertEquals("JAVAD GNSS",            file.getAgencyName());
429         Assert.assertEquals("20191028",              file.getCreationDateString());
430         Assert.assertEquals("005648",                file.getCreationTimeString());
431         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
432         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
433 
434         // Verify data
435         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
436         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
437         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
438         Assert.assertEquals(3, file.getIRNSSNavigationMessages().size());
439         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
440         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
441         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
442 
443         final IRNSSNavigationMessage irnss = file.getIRNSSNavigationMessages("I05").get(0);
444         Assert.assertEquals(0.0, irnss.getEpochToc().durationFrom(new AbsoluteDate(2019, 10, 27, 0, 0, 0, TimeScalesFactory.getIRNSS())), Double.MIN_VALUE);
445         Assert.assertEquals(4.232432693243e-04,  irnss.getAf0(), 1.0e-15);
446         Assert.assertEquals(2.000888343900e-11,  irnss.getAf1(), 1.0e-15);
447         Assert.assertEquals(0.000000000000e+00,  irnss.getAf2(), 1.0e-15);
448         Assert.assertEquals(0,                   irnss.getIODEC());
449         Assert.assertEquals(4.608125000000e+02,  irnss.getCrs(), 1.0e-15);
450         Assert.assertEquals(-2.259193667639e+00, irnss.getM0(), 1.0e-15);
451         Assert.assertEquals(1.492351293564e-05,  irnss.getCuc(), 1.0e-15);
452         Assert.assertEquals(2.073186333291e-03,  irnss.getE(), 1.0e-15);
453         Assert.assertEquals(-2.183392643929e-05, irnss.getCus(), 1.0e-15);
454         Assert.assertEquals(6.493289260864e+03,  FastMath.sqrt(irnss.getSma()), 1.0e-15);
455         Assert.assertEquals(0.000000000000e+00,  irnss.getTime(), 1.0e-15);
456         Assert.assertEquals(-2.868473529816e-07, irnss.getCic(), 1.0e-15);
457         Assert.assertEquals(1.135843714918e+00,  irnss.getOmega0(), 1.0e-15);
458         Assert.assertEquals(-5.215406417847e-08, irnss.getCis(), 1.0e-15);
459         Assert.assertEquals(5.007869522210e-01,  irnss.getI0(), 1.0e-15);
460         Assert.assertEquals(7.530000000000e+02,  irnss.getCrc(), 1.0e-15);
461         Assert.assertEquals(3.073412769875e+00,  irnss.getPa(), 1.0e-15);
462         Assert.assertEquals(-5.227360597694e-09, irnss.getOmegaDot(), 1.0e-15);
463         Assert.assertEquals(4.421612749348e-10,  irnss.getIDot(), 1.0e-15);
464         Assert.assertEquals(2077,                irnss.getWeek());
465         Assert.assertEquals(2.000000000000e+00,  irnss.getURA(), 1.0e-15);
466         Assert.assertEquals(0.000000000000e+00,  irnss.getSvHealth(), 1.0e-15);
467         Assert.assertEquals(-4.656613000000e-10, irnss.getTGD(), 1.0e-15);
468 
469     }
470 
471     @Test
472     public void testMixedRinex304() throws URISyntaxException, IOException {
473 
474         // Parse file
475         final String ex = "/gnss/navigation/Example_Mixed_Rinex304.n";
476         final RinexNavigation file = new RinexNavigationParser().
477                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
478 
479         // Verify Header
480         Assert.assertEquals(3.04,                    file.getFormatVersion(), Double.MIN_VALUE);
481         Assert.assertEquals("N",                     file.getFileType());
482         Assert.assertEquals(SatelliteSystem.MIXED,   file.getSatelliteSystem());
483         Assert.assertEquals("Alloy 5.37",            file.getProgramName());
484         Assert.assertEquals("Receiver Operator",     file.getAgencyName());
485         Assert.assertEquals("20200211",              file.getCreationDateString());
486         Assert.assertEquals("000000",                file.getCreationTimeString());
487         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
488         Assert.assertEquals(0.8382E-08,              file.getKlobucharAlpha()[0], Double.MIN_VALUE);
489         Assert.assertEquals(-0.7451E-08,             file.getKlobucharAlpha()[1], Double.MIN_VALUE);
490         Assert.assertEquals(-0.5960E-07,             file.getKlobucharAlpha()[2], Double.MIN_VALUE);
491         Assert.assertEquals(0.5960E-07,              file.getKlobucharAlpha()[3], Double.MIN_VALUE);
492         Assert.assertEquals(0.8806E+05,              file.getKlobucharBeta()[0],  Double.MIN_VALUE);
493         Assert.assertEquals(-0.1638E+05,             file.getKlobucharBeta()[1],  Double.MIN_VALUE);
494         Assert.assertEquals(-0.1966E+06,             file.getKlobucharBeta()[2],  Double.MIN_VALUE);
495         Assert.assertEquals(0.6554E+05,              file.getKlobucharBeta()[3],  Double.MIN_VALUE);
496         Assert.assertEquals(0.4200E+02,              file.getNeQuickAlpha()[0], Double.MIN_VALUE);
497         Assert.assertEquals(0.1563E-01,              file.getNeQuickAlpha()[1], Double.MIN_VALUE);
498         Assert.assertEquals(0.2045E-02,              file.getNeQuickAlpha()[2], Double.MIN_VALUE);
499         Assert.assertEquals(0.0000E+00,              file.getNeQuickAlpha()[3], Double.MIN_VALUE);
500         Assert.assertEquals("GPUT", file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionType());
501         Assert.assertEquals("GAUT", file.getTimeSystemCorrections().get(1).getTimeSystemCorrectionType());
502         Assert.assertEquals("GPGA", file.getTimeSystemCorrections().get(2).getTimeSystemCorrectionType());
503         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
504 
505         // Verify data
506         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
507         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
508         Assert.assertEquals(2, file.getBeidouNavigationMessages().size());
509         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
510         Assert.assertEquals(1, file.getGlonassNavigationMessages().size());
511         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
512         Assert.assertEquals(2, file.getGPSNavigationMessages().size());
513 
514         final GLONASSNavigationMessage glo = file.getGlonassNavigationMessages("R05").get(0);
515         Assert.assertEquals(0.0, glo.getEpochToc().durationFrom(new AbsoluteDate(2020, 2, 10, 23, 45, 0.0, TimeScalesFactory.getGPS())), Double.MIN_VALUE);
516         Assert.assertEquals(-0.447863712907e-04, glo.getTN(), 1.0e-10);
517         Assert.assertEquals(0.909494701773e-12,  glo.getGammaN(), 1.0e-10);
518         Assert.assertEquals(86370.0,             glo.getTime(), 1.0e-10);
519         Assert.assertEquals(0182.817373047e+05,  glo.getX(), 1.0e-10);
520         Assert.assertEquals(-176.770305634e+01,  glo.getXDot(), 1.0e-10);
521         Assert.assertEquals(651.925802231e-08,   glo.getXDotDot(), 1.0e-10);
522         Assert.assertEquals(0.000000000000e+00,  glo.getHealth(), 1.0e-10);
523         Assert.assertEquals(0114.389570312e+05,  glo.getY(), 1.0e-10);
524         Assert.assertEquals(-619.493484497e+00,  glo.getYDot(), 1.0e-10);
525         Assert.assertEquals(279.396772385e-08,   glo.getYDotDot(), 1.0e-10);
526         Assert.assertEquals(1,                   glo.getFrequencyNumber());
527         Assert.assertEquals(136.489028320e+05,   glo.getZ(), 1.0e-10);
528         Assert.assertEquals(288.632869720e+01,   glo.getZDot(), 1.0e-10);
529         Assert.assertEquals(0.000000000000e+00,  glo.getZDotDot(), 1.0e-10);
530 
531     }
532 
533     @Test
534     public void testQZSSRinex304() throws URISyntaxException, IOException {
535 
536         final String ex = "/gnss/navigation/Example_QZSS_Rinex304.n";
537         final RinexNavigation file = new RinexNavigationParser().
538                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
539 
540         // Verify Header
541         Assert.assertEquals(3.04,                    file.getFormatVersion(), Double.MIN_VALUE);
542         Assert.assertEquals("N",                     file.getFileType());
543         Assert.assertEquals(SatelliteSystem.QZSS,    file.getSatelliteSystem());
544         Assert.assertEquals("JPS2RIN v.2.0.191",     file.getProgramName());
545         Assert.assertEquals("JAVAD GNSS",            file.getAgencyName());
546         Assert.assertEquals("20200610",              file.getCreationDateString());
547         Assert.assertEquals("003246",                file.getCreationTimeString());
548         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
549         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
550 
551         // Verify data
552         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
553         Assert.assertEquals(3, file.getQZSSNavigationMessages().size());
554         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
555         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
556         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
557         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
558         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
559 
560         final QZSSNavigationMessage qzs = file.getQZSSNavigationMessages("J03").get(0);
561         Assert.assertEquals(0.0, qzs.getEpochToc().durationFrom(new AbsoluteDate(2020, 6, 9, 1, 0, 0, TimeScalesFactory.getQZSS())), Double.MIN_VALUE);
562         Assert.assertEquals(-3.880355507135e-06, qzs.getAf0(), 1.0e-15);
563         Assert.assertEquals(-4.547473508865e-13, qzs.getAf1(), 1.0e-15);
564         Assert.assertEquals(0.000000000000e+00,  qzs.getAf2(), 1.0e-15);
565         Assert.assertEquals(193,                 qzs.getIODE());
566         Assert.assertEquals(3.106250000000e+02,  qzs.getCrs(), 1.0e-15);
567         Assert.assertEquals(2.226495657955e+00,  qzs.getM0(), 1.0e-15);
568         Assert.assertEquals(7.346272468567e-06,  qzs.getCuc(), 1.0e-15);
569         Assert.assertEquals(7.470769551583e-02,  qzs.getE(), 1.0e-15);
570         Assert.assertEquals(-2.568960189819e-05, qzs.getCus(), 1.0e-15);
571         Assert.assertEquals(6.493781688690e+03,  FastMath.sqrt(qzs.getSma()), 1.0e-15);
572         Assert.assertEquals(1.764000000000e+05,  qzs.getTime(), 1.0e-15);
573         Assert.assertEquals(-1.853331923485e-06, qzs.getCic(), 1.0e-15);
574         Assert.assertEquals(2.023599801546e+00,  qzs.getOmega0(), 1.0e-15);
575         Assert.assertEquals(1.644715666771e-06,  qzs.getCis(), 1.0e-15);
576         Assert.assertEquals(7.122509413449e-01,  qzs.getI0(), 1.0e-15);
577         Assert.assertEquals(9.670937500000e+02,  qzs.getCrc(), 1.0e-15);
578         Assert.assertEquals(-1.550179221884e+00, qzs.getPa(), 1.0e-15);
579         Assert.assertEquals(-1.478633019572e-09, qzs.getOmegaDot(), 1.0e-15);
580         Assert.assertEquals(-7.193156766709e-10, qzs.getIDot(), 1.0e-15);
581         Assert.assertEquals(2109,                qzs.getWeek());
582         Assert.assertEquals(2.000000000000e+00,  qzs.getSvAccuracy(), 1.0e-15);
583         Assert.assertEquals(0.000000000000e+00,  qzs.getSvHealth(), 1.0e-15);
584         Assert.assertEquals(0.000000000000e+00,  qzs.getTGD(), 1.0e-15);
585         Assert.assertEquals(961,                 qzs.getIODC(), 1.0e-15);
586 
587     }
588 
589     @Test
590     public void testGpsRinex304() throws URISyntaxException, IOException {
591 
592         // Parse file
593         final String ex = "/gnss/navigation/Example_GPS_Rinex304.n";
594         final RinexNavigation file = new RinexNavigationParser().
595                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
596 
597         // Verify Header
598         Assert.assertEquals(3.04,                file.getFormatVersion(), Double.MIN_VALUE);
599         Assert.assertEquals("N",                 file.getFileType());
600         Assert.assertEquals(SatelliteSystem.GPS, file.getSatelliteSystem());
601         Assert.assertEquals("sbf2rin-13.8.0",    file.getProgramName());
602         Assert.assertEquals("",                  file.getAgencyName());
603         Assert.assertEquals("20210307",          file.getCreationDateString());
604         Assert.assertEquals("000819",            file.getCreationTimeString());
605         Assert.assertEquals("UTC",               file.getCreationTimeZoneString());
606         Assert.assertEquals(0.0, file.getCreationDate().durationFrom(new AbsoluteDate(2021, 3, 7, 0, 8, 19.0, TimeScalesFactory.getUTC())), 0.0);
607         Assert.assertEquals("GPS",               file.getIonosphericCorrectionType());
608         Assert.assertEquals(1.0245E-08,          file.getKlobucharAlpha()[0], Double.MIN_VALUE);
609         Assert.assertEquals(0.0000E+00,          file.getKlobucharAlpha()[1], Double.MIN_VALUE);
610         Assert.assertEquals(-5.9605E-08,         file.getKlobucharAlpha()[2], Double.MIN_VALUE);
611         Assert.assertEquals(0.0000E+00,          file.getKlobucharAlpha()[3], Double.MIN_VALUE);
612         Assert.assertEquals(9.0112E+04,          file.getKlobucharBeta()[0],  Double.MIN_VALUE);
613         Assert.assertEquals(0.0000E+00,          file.getKlobucharBeta()[1],  Double.MIN_VALUE);
614         Assert.assertEquals(-1.9661E+05,         file.getKlobucharBeta()[2],  Double.MIN_VALUE);
615         Assert.assertEquals(0.0000E+00,         file.getKlobucharBeta()[3],  Double.MIN_VALUE);
616         Assert.assertEquals("GPUT", file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionType());
617         Assert.assertEquals(0.0000000000E+00,    file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA0(), Double.MIN_VALUE);
618         Assert.assertEquals(9.769962617E-15,     file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionA1(), Double.MIN_VALUE);
619         Assert.assertEquals(233472,              file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionSecOfWeek());
620         Assert.assertEquals(2148,                file.getTimeSystemCorrections().get(0).getTimeSystemCorrectionWeekNumber());
621         Assert.assertEquals(18,                  file.getNumberOfLeapSeconds());
622 
623         // Verify data
624         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
625         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
626         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
627         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
628         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
629         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
630         Assert.assertEquals(3, file.getGPSNavigationMessages().size());
631 
632         final GPSNavigationMessage gps = file.getGPSNavigationMessages("G01").get(0);
633         Assert.assertEquals(0.0, gps.getEpochToc().durationFrom(new AbsoluteDate(2021, 3, 5, 23, 59, 44, TimeScalesFactory.getGPS())), Double.MIN_VALUE);
634         Assert.assertEquals(7.477793842554E-04,  gps.getAf0(), 1.0e-15);
635         Assert.assertEquals(-8.412825991400E-12, gps.getAf1(), 1.0e-15);
636         Assert.assertEquals(0.000000000000e+00,  gps.getAf2(), 1.0e-15);
637         Assert.assertEquals(9,                   gps.getIODE());
638         Assert.assertEquals(-7.434375000000E+01, gps.getCrs(), 1.0e-15);
639         Assert.assertEquals(1.258707807055E+00,  gps.getM0(), 1.0e-15);
640         Assert.assertEquals(-3.753229975700E-06, gps.getCuc(), 1.0e-15);
641         Assert.assertEquals(1.047585485503E-02,  gps.getE(), 1.0e-15);
642         Assert.assertEquals(7.394701242447E-06,  gps.getCus(), 1.0e-15);
643         Assert.assertEquals(5.153690633774E+03,  FastMath.sqrt(gps.getSma()), 1.0e-15);
644         Assert.assertEquals(5.183840000000E+05,  gps.getTime(), 1.0e-15);
645         Assert.assertEquals(-1.359730958939E-07, gps.getCic(), 1.0e-15);
646         Assert.assertEquals(-1.936900950511E+00, gps.getOmega0(), 1.0e-15);
647         Assert.assertEquals(1.136213541031E-07,  gps.getCis(), 1.0e-15);
648         Assert.assertEquals(9.833041013284E-01,  gps.getI0(), 1.0e-15);
649         Assert.assertEquals(2.525937500000E+02,  gps.getCrc(), 1.0e-15);
650         Assert.assertEquals(8.208058952773E-01,  gps.getPa(), 1.0e-15);
651         Assert.assertEquals(-8.015691028563E-09, gps.getOmegaDot(), 1.0e-15);
652         Assert.assertEquals(-1.053615315878E-10, gps.getIDot(), 1.0e-15);
653         Assert.assertEquals(2147,                gps.getWeek());
654         Assert.assertEquals(2.000000000000E+00,  gps.getSvAccuracy(), 1.0e-15);
655         Assert.assertEquals(0.000000000000e+00,  gps.getSvHealth(), 1.0e-15);
656         Assert.assertEquals(4.656612873077E-09,  gps.getTGD(), 1.0e-15);
657         Assert.assertEquals(9,                   gps.getIODC());
658 
659     }
660 
661     @Test
662     public void testGalileoRinex304() throws URISyntaxException, IOException {
663 
664         // Parse file
665         final String ex = "/gnss/navigation/Example_Galileo_Rinex304.n";
666         final RinexNavigation file = new RinexNavigationParser().
667                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
668 
669         // Verify Header
670         Assert.assertEquals(3.04,                    file.getFormatVersion(), Double.MIN_VALUE);
671         Assert.assertEquals("N",                     file.getFileType());
672         Assert.assertEquals(SatelliteSystem.GALILEO, file.getSatelliteSystem());
673         Assert.assertEquals("JPS2RIN v.2.0.191",     file.getProgramName());
674         Assert.assertEquals("JAVAD GNSS",            file.getAgencyName());
675         Assert.assertEquals("20210307",              file.getCreationDateString());
676         Assert.assertEquals("000245",                file.getCreationTimeString());
677         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
678         Assert.assertEquals("GAL",                   file.getIonosphericCorrectionType());
679         Assert.assertEquals(5.0500E+01,              file.getNeQuickAlpha()[0], Double.MIN_VALUE);
680         Assert.assertEquals(2.7344E-02,              file.getNeQuickAlpha()[1], Double.MIN_VALUE);
681         Assert.assertEquals(-1.5869E-03,             file.getNeQuickAlpha()[2], Double.MIN_VALUE);
682         Assert.assertEquals(0.0000E+00,              file.getNeQuickAlpha()[3], Double.MIN_VALUE);
683         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
684 
685         // Verify data
686         Assert.assertEquals(1, file.getGalileoNavigationMessages().size());
687         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
688         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
689         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
690         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
691         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
692         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
693 
694         final GalileoNavigationMessage gal = file.getGalileoNavigationMessages("E13").get(1);
695         Assert.assertEquals(0.0, gal.getEpochToc().durationFrom(new AbsoluteDate(2021, 3, 5, 22, 30, 0, TimeScalesFactory.getGST())), Double.MIN_VALUE);
696         Assert.assertEquals(4.131024470553e-04,  gal.getAf0(), 1.0e-15);
697         Assert.assertEquals(5.400124791777e-13,  gal.getAf1(), 1.0e-15);
698         Assert.assertEquals(0.000000000000e+00,  gal.getAf2(), 1.0e-15);
699         Assert.assertEquals(87,                  gal.getIODNav());
700         Assert.assertEquals(-1.010000000000e+02, gal.getCrs(), 1.0e-15);
701         Assert.assertEquals(1.781709410229e+00,  gal.getM0(), 1.0e-15);
702         Assert.assertEquals(-4.542991518974e-06, gal.getCuc(), 1.0e-15);
703         Assert.assertEquals(3.459260333329e-04,  gal.getE(), 1.0e-15);
704         Assert.assertEquals(5.345791578293e-06,  gal.getCus(), 1.0e-15);
705         Assert.assertEquals(5.440610326767e+03,  FastMath.sqrt(gal.getSma()), 1.0e-15);
706         Assert.assertEquals(5.130000000000e+05,  gal.getTime(), 1.0e-15);
707         Assert.assertEquals(6.332993507385e-08,  gal.getCic(), 1.0e-15);
708         Assert.assertEquals(-2.165492556291e+00, gal.getOmega0(), 1.0e-15);
709         Assert.assertEquals(-4.842877388000e-08, gal.getCis(), 1.0e-15);
710         Assert.assertEquals(9.941388485934e-01,  gal.getI0(), 1.0e-15);
711         Assert.assertEquals(2.392812500000e+02,  gal.getCrc(), 1.0e-15);
712         Assert.assertEquals(-9.613560467153e-01, gal.getPa(), 1.0e-15);
713         Assert.assertEquals(-5.551302662610e-09, gal.getOmegaDot(), 1.0e-15);
714         Assert.assertEquals(-8.321775206769e-11, gal.getIDot(), 1.0e-15);
715         Assert.assertEquals(2147,                gal.getWeek());
716         Assert.assertEquals(3.119999885559e+00,  gal.getSisa(), 1.0e-15);
717         Assert.assertEquals(0.000000000000e+00,  gal.getSvHealth(), 1.0e-15);
718         Assert.assertEquals(4.656612873077e-10,  gal.getBGDE1E5a(), 1.0e-15);
719         Assert.assertEquals(2.328306436539e-10,  gal.getBGDE5bE1(), 1.0e-15);
720 
721     }
722 
723     @Test
724     public void testSBASRinex304() throws URISyntaxException, IOException {
725 
726         // Parse file
727         final String ex = "/gnss/navigation/Example_SBAS_Rinex304.n";
728         final RinexNavigation file = new RinexNavigationParser().
729                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
730 
731         // Verify Header
732         Assert.assertEquals(3.04,                    file.getFormatVersion(), Double.MIN_VALUE);
733         Assert.assertEquals("N",                     file.getFileType());
734         Assert.assertEquals(SatelliteSystem.SBAS,    file.getSatelliteSystem());
735         Assert.assertEquals("sbf2rin-13.4.5",        file.getProgramName());
736         Assert.assertEquals("RIGTC, GO PECNY",       file.getAgencyName());
737         Assert.assertEquals("20210219",              file.getCreationDateString());
738         Assert.assertEquals("002627",                file.getCreationTimeString());
739         Assert.assertEquals("SBAS NAVIGATION DATA FROM STATION GOP6 (RIGTC, GO PECNY)", file.getComments());
740         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
741 
742         // Verify data
743         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
744         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
745         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
746         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
747         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
748         Assert.assertEquals(3, file.getSBASNavigationMessages().size());
749         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
750 
751         final SBASNavigationMessage sbas = file.getSBASNavigationMessages("S36").get(0);
752         Assert.assertEquals(0.0, sbas.getEpochToc().durationFrom(new AbsoluteDate(2021, 2, 17, 23, 58, 56.0, TimeScalesFactory.getGPS())), Double.MIN_VALUE);
753         Assert.assertEquals(0.000000000000E+00, sbas.getAGf0(), 1.0e-10);
754         Assert.assertEquals(0.000000000000E+00, sbas.getAGf1(), 1.0e-10);
755         Assert.assertEquals(3.456150000000E+05, sbas.getTime(), 1.0e-10);
756         Assert.assertEquals(4200.368800000E+04, sbas.getX(), 1.0e-10);
757         Assert.assertEquals(0.000000000000E+00, sbas.getXDot(), 1.0e-10);
758         Assert.assertEquals(0.000000000000E+00, sbas.getXDotDot(), 1.0e-10);
759         Assert.assertEquals(6.300000000000E+01, sbas.getHealth(), 1.0e-10);
760         Assert.assertEquals(3674.846960000E+03, sbas.getY(), 1.0e-10);
761         Assert.assertEquals(0.000000000000E+00, sbas.getYDot(), 1.0e-10);
762         Assert.assertEquals(0.000000000000E+00, sbas.getYDotDot(), 1.0e-10);
763         Assert.assertEquals(3.276700000000E+04, sbas.getURA(), 1.0e-10);
764         Assert.assertEquals(0.000000000000E+00, sbas.getZ(), 1.0e-10);
765         Assert.assertEquals(0.000000000000E+00, sbas.getZDot(), 1.0e-10);
766         Assert.assertEquals(0.000000000000E+00, sbas.getZDotDot(), 1.0e-10);
767         Assert.assertEquals(155,                sbas.getIODN(), 1.0e-10);
768 
769     }
770 
771 
772     @Test
773     public void testIRNSSRinex304() throws URISyntaxException, IOException {
774 
775         final String ex = "/gnss/navigation/Example_IRNSS_Rinex304.n";
776         final RinexNavigation file = new RinexNavigationParser().
777                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
778 
779         // Verify Header
780         Assert.assertEquals(3.04,                    file.getFormatVersion(), Double.MIN_VALUE);
781         Assert.assertEquals("N",                     file.getFileType());
782         Assert.assertEquals(SatelliteSystem.IRNSS,   file.getSatelliteSystem());
783         Assert.assertEquals("JPS2RIN v.2.0.191",     file.getProgramName());
784         Assert.assertEquals("JAVAD GNSS",            file.getAgencyName());
785         Assert.assertEquals("20210308",              file.getCreationDateString());
786         Assert.assertEquals("000304",                file.getCreationTimeString());
787         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
788         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
789 
790         // Verify data
791         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
792         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
793         Assert.assertEquals(0, file.getBeidouNavigationMessages().size());
794         Assert.assertEquals(2, file.getIRNSSNavigationMessages().size());
795         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
796         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
797         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
798 
799         final IRNSSNavigationMessage irnss = file.getIRNSSNavigationMessages("I05").get(0);
800         Assert.assertEquals(0.0, irnss.getEpochToc().durationFrom(new AbsoluteDate(2021, 3, 7, 0, 0, 0, TimeScalesFactory.getIRNSS())), Double.MIN_VALUE);
801         Assert.assertEquals(6.514852866530e-04,  irnss.getAf0(), 1.0e-15);
802         Assert.assertEquals(-7.560174708487e-11, irnss.getAf1(), 1.0e-15);
803         Assert.assertEquals(0.000000000000e+00,  irnss.getAf2(), 1.0e-15);
804         Assert.assertEquals(0,                   irnss.getIODEC());
805         Assert.assertEquals(-3.893125000000e+02, irnss.getCrs(), 1.0e-15);
806         Assert.assertEquals(-7.075087446362e-02, irnss.getM0(), 1.0e-15);
807         Assert.assertEquals(-1.282989978790e-05, irnss.getCuc(), 1.0e-15);
808         Assert.assertEquals(1.970665412955e-03,  irnss.getE(), 1.0e-15);
809         Assert.assertEquals(1.581013202667e-05,  irnss.getCus(), 1.0e-15);
810         Assert.assertEquals(6.493357162476e+03,  FastMath.sqrt(irnss.getSma()), 1.0e-15);
811         Assert.assertEquals(0.000000000000e+00,  irnss.getTime(), 1.0e-15);
812         Assert.assertEquals(-7.078051567078e-08, irnss.getCic(), 1.0e-15);
813         Assert.assertEquals(-1.270986014126e+00, irnss.getOmega0(), 1.0e-15);
814         Assert.assertEquals(2.160668373108e-07,  irnss.getCis(), 1.0e-15);
815         Assert.assertEquals(5.051932936599e-01,  irnss.getI0(), 1.0e-15);
816         Assert.assertEquals(-4.082500000000e+02, irnss.getCrc(), 1.0e-15);
817         Assert.assertEquals(-2.990028662993e+00, irnss.getPa(), 1.0e-15);
818         Assert.assertEquals(-2.734399613005e-09, irnss.getOmegaDot(), 1.0e-15);
819         Assert.assertEquals(6.389551864768e-10,  irnss.getIDot(), 1.0e-15);
820         Assert.assertEquals(2148,                irnss.getWeek());
821         Assert.assertEquals(4.000000000000e+00,  irnss.getURA(), 1.0e-15);
822         Assert.assertEquals(0.000000000000e+00,  irnss.getSvHealth(), 1.0e-15);
823         Assert.assertEquals(-4.656613000000e-10, irnss.getTGD(), 1.0e-15);
824 
825     }
826 
827     @Test
828     public void testBeidouRinex304() throws URISyntaxException, IOException {
829 
830         final String ex = "/gnss/navigation/Example_Beidou_Rinex304.n";
831         final RinexNavigation file = new RinexNavigationParser().
832                         parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
833 
834         // Verify Header
835         Assert.assertEquals(3.04,                    file.getFormatVersion(), Double.MIN_VALUE);
836         Assert.assertEquals("N",                     file.getFileType());
837         Assert.assertEquals(SatelliteSystem.BEIDOU,  file.getSatelliteSystem());
838         Assert.assertEquals("JPS2RIN v.2.0.191",     file.getProgramName());
839         Assert.assertEquals("JAVAD GNSS",            file.getAgencyName());
840         Assert.assertEquals("20210224",              file.getCreationDateString());
841         Assert.assertEquals("000715",                file.getCreationTimeString());
842         Assert.assertEquals("UTC",                   file.getCreationTimeZoneString());
843         Assert.assertEquals(18,                      file.getNumberOfLeapSeconds());
844 
845         // Verify data
846         Assert.assertEquals(0, file.getGalileoNavigationMessages().size());
847         Assert.assertEquals(0, file.getQZSSNavigationMessages().size());
848         Assert.assertEquals(1, file.getBeidouNavigationMessages().size());
849         Assert.assertEquals(0, file.getIRNSSNavigationMessages().size());
850         Assert.assertEquals(0, file.getGlonassNavigationMessages().size());
851         Assert.assertEquals(0, file.getSBASNavigationMessages().size());
852         Assert.assertEquals(0, file.getGPSNavigationMessages().size());
853 
854         final BeidouNavigationMessage bdt = file.getBeidouNavigationMessages("C19").get(0);
855         Assert.assertEquals(0.0, bdt.getEpochToc().durationFrom(new AbsoluteDate(2021, 2, 23, 0, 0, 0, TimeScalesFactory.getBDT())), Double.MIN_VALUE);
856         Assert.assertEquals(7.378066657111e-04,  bdt.getAf0(), 1.0e-15);
857         Assert.assertEquals(1.382893799473e-11,  bdt.getAf1(), 1.0e-15);
858         Assert.assertEquals(0.000000000000e+00,  bdt.getAf2(), 1.0e-15);
859         Assert.assertEquals(1,                   bdt.getAODE());
860         Assert.assertEquals(0,                   bdt.getAODC());
861         Assert.assertEquals(-7.420312500000e+01, bdt.getCrs(), 1.0e-15);
862         Assert.assertEquals(-2.379681558032e-01, bdt.getM0(), 1.0e-15);
863         Assert.assertEquals(-3.555789589882e-06, bdt.getCuc(), 1.0e-15);
864         Assert.assertEquals(8.384847315028e-04,  bdt.getE(), 1.0e-15);
865         Assert.assertEquals(1.072138547897e-05,  bdt.getCus(), 1.0e-15);
866         Assert.assertEquals(5.282626970291e+03,  FastMath.sqrt(bdt.getSma()), 1.0e-15);
867         Assert.assertEquals(1.728000000000e+05,  bdt.getTime(), 1.0e-15);
868         Assert.assertEquals(-2.607703208923e-08, bdt.getCic(), 1.0e-15);
869         Assert.assertEquals(-4.071039898353e-01, bdt.getOmega0(), 1.0e-15);
870         Assert.assertEquals(-6.519258022308e-09, bdt.getCis(), 1.0e-15);
871         Assert.assertEquals(9.657351895813e-01,  bdt.getI0(), 1.0e-15);
872         Assert.assertEquals(1.491093750000e+02,  bdt.getCrc(), 1.0e-15);
873         Assert.assertEquals(-1.225716188251e+00, bdt.getPa(), 1.0e-15);
874         Assert.assertEquals(-6.454554572392e-09, bdt.getOmegaDot(), 1.0e-15);
875         Assert.assertEquals(2.217949529358e-10,  bdt.getIDot(), 1.0e-15);
876         Assert.assertEquals(790,                 bdt.getWeek());
877         Assert.assertEquals(2.000000000000e+00,  bdt.getSvAccuracy(), 1.0e-15);
878         Assert.assertEquals(1.220000000000e-08,  bdt.getTGD1(), 1.0e-15);
879         Assert.assertEquals(1.220000000000e-08,  bdt.getTGD2(), 1.0e-15);
880 
881     }
882 
883     @Test
884     public void testUnknownHeaderKey() throws IOException {
885         try {
886             final String ex = "/gnss/navigation/unknown-key-header.n";
887             new RinexNavigationParser().
888                             parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
889             Assert.fail("an exception should have been thrown");
890         } catch (OrekitException oe) {
891             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
892                                 oe.getSpecifier());
893             Assert.assertEquals(4,  oe.getParts()[0]);
894         }
895     }
896 
897     @Test
898     public void testUnknownRinexVersion() throws IOException {
899         try {
900             final String ex = "/gnss/navigation/unknown-rinex-version.n";
901             new RinexNavigationParser().
902                             parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
903             Assert.fail("an exception should have been thrown");
904         } catch (OrekitException oe) {
905             Assert.assertEquals(OrekitMessages.NAVIGATION_FILE_UNSUPPORTED_VERSION,
906                                 oe.getSpecifier());
907             Assert.assertEquals(9.99,  oe.getParts()[0]);
908         }
909     }
910 
911     @Test
912     public void testWrongFormat() throws IOException {
913         try {
914             final String ex = "/gnss/navigation/wrong-format.n";
915             new RinexNavigationParser().
916                             parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
917             Assert.fail("an exception should have been thrown");
918         } catch (OrekitException oe) {
919             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
920                                 oe.getSpecifier());
921             Assert.assertEquals(4,  oe.getParts()[0]);
922         }
923     }
924 
925 }