1   /* Copyright 2022-2025 Thales Alenia Space
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.rflink.gps;
18  
19  import org.junit.jupiter.api.Assertions;
20  import org.junit.jupiter.api.Test;
21  import org.orekit.errors.OrekitException;
22  import org.orekit.errors.OrekitMessages;
23  import org.orekit.gnss.metric.parser.HexadecimalSequenceEncodedMessage;
24  
25  /** This class aims at validating parsing of GPS RF link messages.
26   * @author Luc Maisonobe
27   */
28  public class SubFramesTest {
29  
30      @Test
31      public void testWrongPreamble() {
32          try {
33              SubFrame.parse(new HexadecimalSequenceEncodedMessage("8c0308d40008c3c7978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c4732e9bb840"));
34              Assertions.fail("an exception should have been thrown");
35          } catch (OrekitException oe) {
36              Assertions.assertEquals(OrekitMessages.INVALID_GNSS_DATA, oe.getSpecifier());
37              Assertions.assertEquals(0x8c, ((Integer) oe.getParts()[0]).intValue());
38          }
39      }
40  
41      @Test
42      public void testWrongSvId() {
43          try {
44              // replaced ID 57 = (111001) base 2 with ID 9 = (001001) base 2 and updated parity
45              SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540008c3c4978c940da8a66c3a6f2c5b8c0529426a21a8317a01f10526c48f2e9bbbb0"));
46              Assertions.fail("an exception should have been thrown");
47          } catch (OrekitException oe) {
48              Assertions.assertEquals(OrekitMessages.INVALID_GNSS_DATA, oe.getSpecifier());
49              Assertions.assertEquals(9, ((Integer) oe.getParts()[0]).intValue());
50          }
51      }
52  
53      @Test
54      public void testParityError() {
55          try {
56              SubFrame.parse(new HexadecimalSequenceEncodedMessage("8c0308540008c3e7978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c4732e9bb840"));
57              Assertions.fail("an exception should have been thrown");
58          } catch (OrekitException oe) {
59              Assertions.assertEquals(OrekitMessages.GNSS_PARITY_ERROR, oe.getSpecifier());
60              Assertions.assertEquals(0x1, ((Integer) oe.getParts()[0]).intValue());
61          }
62      }
63  
64      @Test
65      public void testSubFrame1() {
66          SubFrame1 sf = (SubFrame1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854068892030900060162f57126c4c680d21f5fdfcc40a7978070bc00ffd4307a443c40"));
67          Assertions.assertEquals(139,     sf.getPreamble());
68          Assertions.assertEquals(194,     sf.getMessage());
69          Assertions.assertEquals(0,       sf.getIntegrityStatus());
70          Assertions.assertEquals(5016,    sf.getTow());
71          Assertions.assertEquals(0,       sf.getAlert());
72          Assertions.assertEquals(1,       sf.getAntiSpoofing());
73          Assertions.assertEquals(1,       sf.getId());
74          Assertions.assertEquals(194,     sf.getWeekNumber());
75          Assertions.assertEquals(1,       sf.getCaOrPFlag());
76          Assertions.assertEquals(0,       sf.getUraIndex());
77          Assertions.assertEquals(0,       sf.getSvHealth());
78          Assertions.assertEquals(94,      sf.getIODC());
79          Assertions.assertEquals(0,       sf.getL2PDataFlag());
80          Assertions.assertEquals(363477,  sf.getReserved04());
81          Assertions.assertEquals(2540742, sf.getReserved05());
82          Assertions.assertEquals(3442647, sf.getReserved06());
83          Assertions.assertEquals(64708,   sf.getReserved07());
84          Assertions.assertEquals(10,      sf.getTGD());
85          Assertions.assertEquals(450,     sf.getTOC());
86          Assertions.assertEquals(0.0,                   sf.getAF2(), 1.0e-15);
87          Assertions.assertEquals(7.445578376064077E-9,  sf.getAF1(), 1.0e-15);
88          Assertions.assertEquals(2.3320456966757774E-4, sf.getAF0(), 1.0e-15);
89      }
90  
91      @Test
92      public void testSubFrame2() {
93          SubFrame2 sf = (SubFrame2) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540d2ea746b030f34bb0912d308f53300904199380148d3fca68580d378bd40e11fd40"));
94          Assertions.assertEquals(139,                  sf.getPreamble());
95          Assertions.assertEquals(194,                  sf.getMessage());
96          Assertions.assertEquals(0,                    sf.getIntegrityStatus());
97          Assertions.assertEquals(10122,                sf.getTow());
98          Assertions.assertEquals(0,                    sf.getAlert());
99          Assertions.assertEquals(1,                    sf.getAntiSpoofing());
100         Assertions.assertEquals(2,                    sf.getId());
101         Assertions.assertEquals(107,                  sf.getIODE());
102         Assertions.assertEquals(24.46875,             sf.getCrs(), 1.0e-15);
103         Assertions.assertEquals(4.275178078327134E-9, sf.getDeltaN(), 1.0e-15);
104         Assertions.assertEquals(1.6736267155104847,   sf.getM0(), 1.0e-15);
105         Assertions.assertEquals(3.3764149269486122E-6,sf.getCuc(), 1.0e-15);
106         Assertions.assertEquals(0.01214603427797556,  sf.getE(), 1.0e-15);
107         Assertions.assertEquals(3.822370874232414E-4, sf.getCus(), 1.0e-15);
108         Assertions.assertEquals(-3038.34787940979,    sf.getSqrtA(), 1.0e-15);
109         Assertions.assertEquals(14400,                sf.getToe());
110         Assertions.assertEquals(0,                    sf.getFitInterval());
111         Assertions.assertEquals(27900,                sf.getAODO());
112     }
113 
114     @Test
115     public void testSubFrame3() {
116         SubFrame3 sf = (SubFrame3) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540326b70ffe3cceee041fc9004128d12d58220319126b123f7db4ffa35bbd7be89080"));
117         Assertions.assertEquals(139,                  sf.getPreamble());
118         Assertions.assertEquals(194,                  sf.getMessage());
119         Assertions.assertEquals(0,                    sf.getIntegrityStatus());
120         Assertions.assertEquals(2418,                 sf.getTow());
121         Assertions.assertEquals(0,                    sf.getAlert());
122         Assertions.assertEquals(1,                    sf.getAntiSpoofing());
123         Assertions.assertEquals(3,                    sf.getId());
124         Assertions.assertEquals(1.220162957906723E-4, sf.getCic(),             1.0e-15);
125         Assertions.assertEquals(-1.2586250585571226,  sf.getUppercaseOmega0(), 1.0e-15);
126         Assertions.assertEquals(1.210719347000122E-7, sf.getCis(),             1.0e-15);
127         Assertions.assertEquals(0.9889704584978043,   sf.getI0(),              1.0e-15);
128         Assertions.assertEquals(396.53125,            sf.getCrc(),             1.0e-15);
129         Assertions.assertEquals(0.9396583427359628,   sf.getLowercaseOmega(),  1.0e-15);
130         Assertions.assertEquals(5.983641742696371E-6, sf.getOmegaDot(),        1.0e-15);
131         Assertions.assertEquals(94,                   sf.getIODE());
132         Assertions.assertEquals(5.71773816674512E-9,  sf.getIDot(),            1.0e-15);
133     }
134 
135     @Test
136     public void testSubFrame4Page01() {
137         SubFrame4A0 page01 = (SubFrame4A0) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540008c3c7978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c4732e9bb840"));
138         Assertions.assertEquals(     139, page01.getPreamble());
139         Assertions.assertEquals(     194, page01.getMessage());
140         Assertions.assertEquals(       0, page01.getIntegrityStatus());
141         Assertions.assertEquals(      24, page01.getTow());
142         Assertions.assertEquals(       0, page01.getAlert());
143         Assertions.assertEquals(       1, page01.getAntiSpoofing());
144         Assertions.assertEquals(       4, page01.getId());
145         Assertions.assertEquals(       1, page01.getDataId());
146         Assertions.assertEquals(      57, page01.getSvId());
147         Assertions.assertEquals(   30921, page01.getReserved03());
148         Assertions.assertEquals( 3580569, page01.getReserved04());
149         Assertions.assertEquals( 3829548, page01.getReserved05());
150         Assertions.assertEquals(14877002, page01.getReserved06());
151         Assertions.assertEquals( 2531866, page01.getReserved07());
152         Assertions.assertEquals(12969991, page01.getReserved08());
153         Assertions.assertEquals(       5, page01.getReservedA09());
154         Assertions.assertEquals(    9924, page01.getReservedB09());
155         Assertions.assertEquals( 3336635, page01.getReserved10());
156         Assertions.assertFalse(page01.hasParityErrors());
157 
158         // raw 30 bits words
159         final int word01 = 0x8b030854 >>> 2;
160         final int word02 = 0x40008c3c & 0x3FFFFFFF;
161         final int word03 = 0x7978c9dc >>> 2;
162         final int word04 = 0xcda8a653 & 0x3FFFFFFF;
163         final int word05 = 0x3a6f2ca7 >>> 2;
164         final int word06 = 0x78c052ab & 0x3FFFFFFF;
165         final int word07 = 0x26a21a7f >>> 2;
166         final int word08 = 0xf17a01ce & 0x3FFFFFFF;
167         final int word09 = 0x0526c473 >>> 2;
168         final int word10 = 0x32e9bb84 & 0x3FFFFFFF;
169 
170         Assertions.assertEquals((word01 >>>  8) &   0x3FFF, page01.getMessage());
171         Assertions.assertEquals((word02 >>>  8) &      0x7, page01.getId());
172         Assertions.assertEquals((word03 >>>  6) &   0xFFFF, page01.getReserved03());
173         Assertions.assertEquals((word04 >>>  6) & 0xFFFFFF, page01.getReserved04());
174         Assertions.assertEquals((word05 >>>  6) & 0xFFFFFF, page01.getReserved05());
175         Assertions.assertEquals((word06 >>>  6) & 0xFFFFFF, page01.getReserved06());
176         Assertions.assertEquals((word07 >>>  6) & 0xFFFFFF, page01.getReserved07());
177         Assertions.assertEquals((word08 >>>  6) & 0xFFFFFF, page01.getReserved08());
178         Assertions.assertEquals((word09 >>> 22) &     0xFF, page01.getReservedA09());
179         Assertions.assertEquals((word09 >>>  6) &   0xFFFF, page01.getReservedB09());
180         Assertions.assertEquals((word10 >>>  8) & 0x3FFFFF, page01.getReserved10());
181 
182     }
183 
184     @Test
185     public void testSubFrame4Page02() {
186         SubFrameAlmanac page02 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540012c68595a43dc90200abfd4c00ce843061a7649d8a4a4b16351ee15418d4009d00"));
187         Assertions.assertEquals(                  139, page02.getPreamble());
188         Assertions.assertEquals(                  194, page02.getMessage());
189         Assertions.assertEquals(                    0, page02.getIntegrityStatus());
190         Assertions.assertEquals(                   54, page02.getTow());
191         Assertions.assertEquals(                    0, page02.getAlert());
192         Assertions.assertEquals(                    1, page02.getAntiSpoofing());
193         Assertions.assertEquals(                    4, page02.getId());
194         Assertions.assertEquals(                    1, page02.getDataId());
195         Assertions.assertEquals(                   25, page02.getSvId());
196         Assertions.assertEquals(  0.01101827621459961, page02.getE(),               1.0e-15);
197         Assertions.assertEquals(               147456, page02.getToaA());
198         Assertions.assertEquals( 0.012283830527990513, page02.getDeltai(),          1.0e-15);
199         Assertions.assertEquals( 7.411051557187493E-7, page02.getOmegaDot(),        1.0e-15);
200         Assertions.assertEquals(                    0, page02.getSvHealth());
201         Assertions.assertEquals(        5153.51171875, page02.getSqrtA(),           1.0e-15);
202         Assertions.assertEquals(   2.9032354083909366, page02.getUppercaseOmega0(), 1.0e-15);
203         Assertions.assertEquals(    1.010542800638158, page02.getLowercaseOmega(),  1.0e-15);
204         Assertions.assertEquals(   0.7579138416051279, page02.getM0(),              1.0e-15);
205         Assertions.assertEquals(4.0531158447265625E-4, page02.getAF0(),             1.0e-15);
206         Assertions.assertEquals(3.637978807091713E-12, page02.getAF1(),             1.0e-15);
207     }
208 
209     @Test
210     public void testSubFrame4Page03() {
211         SubFrameAlmanac page03 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854001cc0c5a3f0ad493ede0afd37008e84318fd742311b44484c0dfedaab307c003f80"));
212         Assertions.assertEquals( 84, page03.getTow());
213         Assertions.assertEquals(  4, page03.getId());
214         Assertions.assertEquals(  1, page03.getDataId());
215         Assertions.assertEquals( 26, page03.getSvId());
216     }
217 
218     @Test
219     public void testSubFrame4Page04() {
220         SubFrameAlmanac page04 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540026cc05b5a184c9047207fd6000068433dd5a13e92c06f96b70b6cad1344bfeedc0"));
221         Assertions.assertEquals(114, page04.getTow());
222         Assertions.assertEquals(  4, page04.getId());
223         Assertions.assertEquals(  1, page04.getDataId());
224         Assertions.assertEquals( 27, page04.getSvId());
225     }
226 
227     @Test
228     public void testSubFrame4Page05() {
229         // page 5 should be almanac for PRN 28, but here holds a dummy almanac (SV 0)
230         SubFrameDummyAlmanac page05 = (SubFrameDummyAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540030c2040aaaab2aaaaabcaaaaaaf2aaaaabcaaaaaaf2aaaaabcaaaaaaf2aaaaabc0"));
231         Assertions.assertEquals(144, page05.getTow());
232         Assertions.assertEquals(  4, page05.getId());
233         Assertions.assertEquals(  1, page05.getDataId());
234         Assertions.assertEquals(  0, page05.getSvId());
235     }
236 
237     @Test
238     public void testSubFrame4Page06() {
239         SubFrame4A0 page06 = (SubFrame4A0) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854003acbc7978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c47183039880"));
240         Assertions.assertEquals(174, page06.getTow());
241         Assertions.assertEquals(  4, page06.getId());
242         Assertions.assertEquals(  1, page06.getDataId());
243         Assertions.assertEquals( 57, page06.getSvId());
244     }
245 
246     @Test
247     public void testSubFrame4Page07() {
248         SubFrameAlmanac page07 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540044cb05d113640905defcfd65003a84320e6a46fe0098ef2fc4b41fe2e2d3ffbb00"));
249         Assertions.assertEquals(204, page07.getTow());
250         Assertions.assertEquals(  4, page07.getId());
251         Assertions.assertEquals(  1, page07.getDataId());
252         Assertions.assertEquals( 29, page07.getSvId());
253     }
254 
255     @Test
256     public void testSubFrame4Page08() {
257         SubFrameAlmanac page08 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854004ec2c5e31142893ed016fd3500f284330ae4c83f4e64d436513d0410dae4007640"));
258         Assertions.assertEquals(234, page08.getTow());
259         Assertions.assertEquals(  4, page08.getId());
260         Assertions.assertEquals(  1, page08.getDataId());
261         Assertions.assertEquals( 30, page08.getSvId());
262     }
263 
264     @Test
265     public void testSubFrame4Page09() {
266         SubFrameAlmanac page09 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540058ccc5f585130901e8b9fd4600e284323814cf61d504f39dc92ad34b1f94002c00"));
267         Assertions.assertEquals(264, page09.getTow());
268         Assertions.assertEquals(  4, page09.getId());
269         Assertions.assertEquals(  1, page09.getDataId());
270         Assertions.assertEquals( 31, page09.getSvId());
271     }
272 
273     @Test
274     public void testSubFrame4Page10() {
275         SubFrameAlmanac page10 = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540062c0060343d0c902b213fd60000684349462101d9b28b1abdad379494b4ffe0800"));
276         Assertions.assertEquals(294, page10.getTow());
277         Assertions.assertEquals(  4, page10.getId());
278         Assertions.assertEquals(  1, page10.getDataId());
279         Assertions.assertEquals( 32, page10.getSvId());
280     }
281 
282     @Test
283     public void testSubFrame4Page11() {
284         SubFrame4A0 page11 = (SubFrame4A0) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854006cc647978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c473fddb08c0"));
285         Assertions.assertEquals(324, page11.getTow());
286         Assertions.assertEquals(  4, page11.getId());
287         Assertions.assertEquals(  1, page11.getDataId());
288         Assertions.assertEquals( 57, page11.getSvId());
289     }
290 
291     @Test
292     public void testSubFrame4Page12() {
293         SubFrame4A1 page12 = (SubFrame4A1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540076c307e04887f64206ee7d8a2d7572d5e09e14d671b724005fe9910ba732a8f2c0"));
294         Assertions.assertEquals(     139, page12.getPreamble());
295         Assertions.assertEquals(     194, page12.getMessage());
296         Assertions.assertEquals(       0, page12.getIntegrityStatus());
297         Assertions.assertEquals(     354, page12.getTow());
298         Assertions.assertEquals(       0, page12.getAlert());
299         Assertions.assertEquals(       1, page12.getAntiSpoofing());
300         Assertions.assertEquals(       4, page12.getId());
301         Assertions.assertEquals(       1, page12.getDataId());
302         Assertions.assertEquals(      62, page12.getSvId());
303         Assertions.assertEquals(    1160, page12.getReserved03());
304         Assertions.assertEquals(14223387, page12.getReserved04());
305         Assertions.assertEquals( 8227373, page12.getReserved05());
306         Assertions.assertEquals( 6075768, page12.getReserved06());
307         Assertions.assertEquals(14765415, page12.getReserved07());
308         Assertions.assertEquals(14454785, page12.getReserved08());
309         Assertions.assertEquals(     233, page12.getReservedA09());
310         Assertions.assertEquals(   37131, page12.getReservedB09());
311         Assertions.assertEquals( 3353231, page12.getReserved10());
312     }
313 
314     @Test
315     public void testSubFrame4Page13() {
316         SubFrame4C page13 = (SubFrame4C) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540080ce4747026e640a3f104b3e59089759d1957cd4b951ec3140e6f502c059fa8380"));
317         Assertions.assertEquals(139, page13.getPreamble());
318         Assertions.assertEquals(194, page13.getMessage());
319         Assertions.assertEquals(  0, page13.getIntegrityStatus());
320         Assertions.assertEquals(384, page13.getTow());
321         Assertions.assertEquals(  0, page13.getAlert());
322         Assertions.assertEquals(  1, page13.getAntiSpoofing());
323         Assertions.assertEquals(  4, page13.getId());
324         Assertions.assertEquals(  1, page13.getDataId());
325         Assertions.assertEquals( 52, page13.getSvId());
326         Assertions.assertEquals( 48, page13.getERD( 1));
327         Assertions.assertEquals(  9, page13.getERD( 2));
328         Assertions.assertEquals( 41, page13.getERD( 3));
329         Assertions.assertEquals(  9, page13.getERD( 4));
330         Assertions.assertEquals(  0, page13.getERD( 5));
331         Assertions.assertEquals( 40, page13.getERD( 6));
332         Assertions.assertEquals( 63, page13.getERD( 7));
333         Assertions.assertEquals(  4, page13.getERD( 8));
334         Assertions.assertEquals(  4, page13.getERD( 9));
335         Assertions.assertEquals( 44, page13.getERD(10));
336         Assertions.assertEquals( 62, page13.getERD(11));
337         Assertions.assertEquals( 22, page13.getERD(12));
338         Assertions.assertEquals( 18, page13.getERD(13));
339         Assertions.assertEquals(  2, page13.getERD(14));
340         Assertions.assertEquals( 23, page13.getERD(15));
341         Assertions.assertEquals( 22, page13.getERD(16));
342         Assertions.assertEquals( 29, page13.getERD(17));
343         Assertions.assertEquals(  5, page13.getERD(18));
344         Assertions.assertEquals(  5, page13.getERD(19));
345         Assertions.assertEquals( 31, page13.getERD(20));
346         Assertions.assertEquals( 13, page13.getERD(21));
347         Assertions.assertEquals( 18, page13.getERD(22));
348         Assertions.assertEquals( 52, page13.getERD(23));
349         Assertions.assertEquals(  4, page13.getERD(24));
350         Assertions.assertEquals( 30, page13.getERD(25));
351         Assertions.assertEquals( 48, page13.getERD(26));
352         Assertions.assertEquals( 49, page13.getERD(27));
353         Assertions.assertEquals( 30, page13.getERD(28));
354         Assertions.assertEquals( 14, page13.getERD(29));
355         Assertions.assertEquals( 27, page13.getERD(30));
356     }
357 
358     @Test
359     public void testSubFrame4Page14() {
360         SubFrame4B page14 = (SubFrame4B) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854008ac7875aaaac6aaaaaaaaaaaaa56aaaaaaaaaaaaa56aaaaaaaaaaaaa56aaaaa5c0"));
361         Assertions.assertEquals(     139, page14.getPreamble());
362         Assertions.assertEquals(     194, page14.getMessage());
363         Assertions.assertEquals(       0, page14.getIntegrityStatus());
364         Assertions.assertEquals(     414, page14.getTow());
365         Assertions.assertEquals(       0, page14.getAlert());
366         Assertions.assertEquals(       1, page14.getAntiSpoofing());
367         Assertions.assertEquals(       4, page14.getId());
368         Assertions.assertEquals(       1, page14.getDataId());
369         Assertions.assertEquals(      53, page14.getSvId());
370         Assertions.assertEquals(   43690, page14.getReserved03());
371         Assertions.assertEquals(11184810, page14.getReserved04());
372         Assertions.assertEquals(11184810, page14.getReserved05());
373         Assertions.assertEquals(11184810, page14.getReserved06());
374         Assertions.assertEquals(11184810, page14.getReserved07());
375         Assertions.assertEquals(11184810, page14.getReserved08());
376         Assertions.assertEquals(11184810, page14.getReserved09());
377         Assertions.assertEquals( 2796202, page14.getReserved10());
378     }
379 
380     @Test
381     public void testSubFrame4Page15() {
382         SubFrame4B page15 = (SubFrame4B) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540094cd476aaaa9aaaaabcd3f494828e2dfabec3504c536fcf2a194c3eb3d2833efc0"));
383         Assertions.assertEquals(444, page15.getTow());
384         Assertions.assertEquals(  4, page15.getId());
385         Assertions.assertEquals(  1, page15.getDataId());
386         Assertions.assertEquals( 54, page15.getSvId());
387     }
388 
389     @Test
390     public void testSubFrame4Page16() {
391         SubFrame4A0 page16 = (SubFrame4A0) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b030854009ec487978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c4705db5bb00"));
392         Assertions.assertEquals(474, page16.getTow());
393         Assertions.assertEquals(  4, page16.getId());
394         Assertions.assertEquals(  1, page16.getDataId());
395         Assertions.assertEquals( 57, page16.getSvId());
396     }
397 
398     @Test
399     public void testSubFrame4Page17() {
400         SubFrame4B page17 = (SubFrame4B) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400a8c30772053a958dcaf3f84938693528c3c504838551d08c0b2239494d5d080580"));
401         Assertions.assertEquals(504, page17.getTow());
402         Assertions.assertEquals(  4, page17.getId());
403         Assertions.assertEquals(  1, page17.getDataId());
404         Assertions.assertEquals( 55, page17.getSvId());
405     }
406 
407     @Test
408     public void testSubFrame4Page18() {
409         SubFrame4D page18 = (SubFrame4D) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400b2c647811ff03fc08ff7f301051fffffea4ffffff0ffc930b7128907c048000f00"));
410         Assertions.assertEquals(                   139, page18.getPreamble());
411         Assertions.assertEquals(                   194, page18.getMessage());
412         Assertions.assertEquals(                     0, page18.getIntegrityStatus());
413         Assertions.assertEquals(                   534, page18.getTow());
414         Assertions.assertEquals(                     0, page18.getAlert());
415         Assertions.assertEquals(                     1, page18.getAntiSpoofing());
416         Assertions.assertEquals(                     4, page18.getId());
417         Assertions.assertEquals(                     1, page18.getDataId());
418         Assertions.assertEquals(                    56, page18.getSvId());
419         Assertions.assertEquals( 1.5832483768463135E-8, page18.getAlpha0(), 1.0e-15);
420         Assertions.assertEquals(  6.047563327615444E-7, page18.getAlpha1(), 1.0e-15);
421         Assertions.assertEquals(  1.539999355602027E-6, page18.getAlpha2(), 1.0e-15);
422         Assertions.assertEquals(  3.844682506704244E-9, page18.getAlpha3(), 1.0e-15);
423         Assertions.assertEquals(              129024.0, page18.getBeta0(),  1.0e-15);
424         Assertions.assertEquals(    1267290.9695821572, page18.getBeta1(),  1.0e-15);
425         Assertions.assertEquals(     6640.185091184218, page18.getBeta2(),  1.0e-15);
426         Assertions.assertEquals(    10568.182803070738, page18.getBeta3(),  1.0e-15);
427         Assertions.assertEquals( 1.4901155864777138E-8, page18.getA1(),     1.0e-15);
428         Assertions.assertEquals(-9.313225746154785E-10, page18.getA0(),     1.0e-15);
429         Assertions.assertEquals(                147456, page18.getTot());
430         Assertions.assertEquals(                   194, page18.getWeekNumberT());
431         Assertions.assertEquals(                    18, page18.getDeltaTLs());
432         Assertions.assertEquals(                   137, page18.getWeekNumberLsf());
433         Assertions.assertEquals(                     7, page18.getDn());
434         Assertions.assertEquals(                    18, page18.getDeltaTLsf());
435         Assertions.assertEquals(                     0, page18.getReserved10());
436     }
437 
438     @Test
439     public void testSubFrame4Page19() {
440         SubFrame4A1 page19 = (SubFrame4A1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400bcc007a8462455cd2b586377bd0162ada731d15f824cc2805767a31bedb12b2780"));
441         Assertions.assertEquals(564, page19.getTow());
442         Assertions.assertEquals(  4, page19.getId());
443         Assertions.assertEquals(  1, page19.getDataId());
444         Assertions.assertEquals( 58, page19.getSvId());
445     }
446 
447     @Test
448     public void testSubFrame4Page20() {
449         SubFrame4A1 page20 = (SubFrame4A1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400c6cf47b1ef74c48f76b6634b680ce21fc6dc1e416b04c2c0749266de7d218ad940"));
450         Assertions.assertEquals(594, page20.getTow());
451         Assertions.assertEquals(  4, page20.getId());
452         Assertions.assertEquals(  1, page20.getDataId());
453         Assertions.assertEquals( 59, page20.getSvId());
454     }
455 
456     @Test
457     public void testSubFrame4Page21() {
458         SubFrame4A0 page21 = (SubFrame4A0) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400d0c147978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c473e1a50a00"));
459         Assertions.assertEquals(624, page21.getTow());
460         Assertions.assertEquals(  4, page21.getId());
461         Assertions.assertEquals(  1, page21.getDataId());
462         Assertions.assertEquals( 57, page21.getSvId());
463     }
464 
465     @Test
466     public void testSubFrame4Page22() {
467         SubFrame4A1 page22 = (SubFrame4A1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400dac887cba28a19cb45c2edb526417155cea9358a10b72e804cb02d07310876ac40"));
468         Assertions.assertEquals(654, page22.getTow());
469         Assertions.assertEquals(  4, page22.getId());
470         Assertions.assertEquals(  1, page22.getDataId());
471         Assertions.assertEquals( 60, page22.getSvId());
472     }
473 
474     @Test
475     public void testSubFrame4Page23() {
476         SubFrame4A1 page23 = (SubFrame4A1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400e4cbc7d1a0d4b815fad54cf28e58bd3fb3cbc178da9482c064cfae562eebf580c0"));
477         Assertions.assertEquals(684, page23.getTow());
478         Assertions.assertEquals(  4, page23.getId());
479         Assertions.assertEquals(  1, page23.getDataId());
480         Assertions.assertEquals( 61, page23.getSvId());
481     }
482 
483     @Test
484     public void testSubFrame4Page24() {
485         SubFrame4A1 page24 = (SubFrame4A1) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400eec207e04887f64206ee7d8a2d7572d5e09e14d671b724005fe9a10aceaaaaad00"));
486         Assertions.assertEquals(714, page24.getTow());
487         Assertions.assertEquals(  4, page24.getId());
488         Assertions.assertEquals(  1, page24.getDataId());
489         Assertions.assertEquals( 62, page24.getSvId());
490     }
491 
492     @Test
493     public void testSubFrame4Page25() {
494         SubFrame4E page25 = (SubFrame4E) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085400f8cc07fb9bcbeaeaeeffca9ca94ab266663cbbbbcd6aeac025000fc04000000000"));
495         Assertions.assertEquals(139, page25.getPreamble());
496         Assertions.assertEquals(194, page25.getMessage());
497         Assertions.assertEquals(  0, page25.getIntegrityStatus());
498         Assertions.assertEquals(744, page25.getTow());
499         Assertions.assertEquals(  0, page25.getAlert());
500         Assertions.assertEquals(  1, page25.getAntiSpoofing());
501         Assertions.assertEquals(  4, page25.getId());
502         Assertions.assertEquals(  1, page25.getDataId());
503         Assertions.assertEquals( 63, page25.getSvId());
504         Assertions.assertEquals( 11, page25.getAntiSpoofing( 1));
505         Assertions.assertEquals(  9, page25.getAntiSpoofing( 2));
506         Assertions.assertEquals( 11, page25.getAntiSpoofing( 3));
507         Assertions.assertEquals( 12, page25.getAntiSpoofing( 4));
508         Assertions.assertEquals( 10, page25.getAntiSpoofing( 5));
509         Assertions.assertEquals( 11, page25.getAntiSpoofing( 6));
510         Assertions.assertEquals( 10, page25.getAntiSpoofing( 7));
511         Assertions.assertEquals( 11, page25.getAntiSpoofing( 8));
512         Assertions.assertEquals( 11, page25.getAntiSpoofing( 9));
513         Assertions.assertEquals( 11, page25.getAntiSpoofing(10));
514         Assertions.assertEquals( 12, page25.getAntiSpoofing(11));
515         Assertions.assertEquals( 10, page25.getAntiSpoofing(12));
516         Assertions.assertEquals(  9, page25.getAntiSpoofing(13));
517         Assertions.assertEquals( 12, page25.getAntiSpoofing(14));
518         Assertions.assertEquals( 10, page25.getAntiSpoofing(15));
519         Assertions.assertEquals(  9, page25.getAntiSpoofing(16));
520         Assertions.assertEquals( 10, page25.getAntiSpoofing(17));
521         Assertions.assertEquals( 12, page25.getAntiSpoofing(18));
522         Assertions.assertEquals(  9, page25.getAntiSpoofing(19));
523         Assertions.assertEquals(  9, page25.getAntiSpoofing(20));
524         Assertions.assertEquals(  9, page25.getAntiSpoofing(21));
525         Assertions.assertEquals(  9, page25.getAntiSpoofing(22));
526         Assertions.assertEquals( 12, page25.getAntiSpoofing(23));
527         Assertions.assertEquals( 11, page25.getAntiSpoofing(24));
528         Assertions.assertEquals( 11, page25.getAntiSpoofing(25));
529         Assertions.assertEquals( 11, page25.getAntiSpoofing(26));
530         Assertions.assertEquals( 11, page25.getAntiSpoofing(27));
531         Assertions.assertEquals( 12, page25.getAntiSpoofing(28));
532         Assertions.assertEquals( 10, page25.getAntiSpoofing(29));
533         Assertions.assertEquals( 11, page25.getAntiSpoofing(30));
534         Assertions.assertEquals( 10, page25.getAntiSpoofing(31));
535         Assertions.assertEquals( 11, page25.getAntiSpoofing(32));
536         Assertions.assertEquals(  0, page25.getReserved8());
537         Assertions.assertEquals(  0, page25.getSvHealth(1));
538         Assertions.assertEquals(  0, page25.getSvHealth(2));
539         Assertions.assertEquals( 63, page25.getSvHealth(3));
540         Assertions.assertEquals(  0, page25.getSvHealth(4));
541         Assertions.assertEquals(  0, page25.getSvHealth(5));
542         Assertions.assertEquals(  0, page25.getSvHealth(6));
543         Assertions.assertEquals(  0, page25.getSvHealth(7));
544         Assertions.assertEquals(  0, page25.getSvHealth(8));
545         Assertions.assertEquals(  0, page25.getReserved10());
546     }
547 
548     @Test
549     public void testSubFrame4Page26() {
550         SubFrame4A0 page26 = (SubFrame4A0) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b0308540102cd07978c9dcda8a6533a6f2ca78c052ab26a21a7f17a01ce0526c4732e9bb840"));
551         Assertions.assertEquals(774, page26.getTow());
552         Assertions.assertEquals(  4, page26.getId());
553         Assertions.assertEquals(  1, page26.getDataId());
554         Assertions.assertEquals( 57, page26.getSvId());
555     }
556 
557     @Test
558     public void testSubFrame5Almanac() {
559         SubFrameAlmanac almanac = (SubFrameAlmanac) SubFrame.parse(new HexadecimalSequenceEncodedMessage("8b03085412acda043242dece45a69afd4300de8436811f6b0e290a9631922b9fd70b38007040"));
560         Assertions.assertEquals(               14340,   almanac.getTow());
561         Assertions.assertEquals(                   5,   almanac.getId());
562         Assertions.assertEquals(                   1,   almanac.getDataId());
563         Assertions.assertEquals(                   3,   almanac.getSvId());
564         Assertions.assertEquals(                   3,   almanac.getPRN());
565         Assertions.assertEquals(              233472,   almanac.getToaA());
566         Assertions.assertEquals( 0.03467036265119664,   almanac.getDeltai(),          1.0e-15);
567         Assertions.assertEquals(7.410022942913008e-7,   almanac.getOmegaDot(),        1.0e-15);
568         Assertions.assertEquals(                   0,   almanac.getSvHealth());
569         Assertions.assertEquals(         5153.703125,   almanac.getSqrtA(),           1.0e-15);
570         Assertions.assertEquals(   6.054706808373034,   almanac.getUppercaseOmega0(), 1.0e-15);
571         Assertions.assertEquals(   1.039346136184126,   almanac.getLowercaseOmega(),  1.0e-15);
572         Assertions.assertEquals(    1.07070323515602,   almanac.getM0(),              1.0e-15);
573         Assertions.assertEquals( 0.0015783309936523438, almanac.getAF0(),             1.0e-15);
574         Assertions.assertEquals(                   0.0, almanac.getAF1(),             1.0e-15);
575     }
576 
577 }