1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.gnss.metric.messages.ssr;
18
19 import org.junit.jupiter.api.Assertions;
20 import org.junit.jupiter.api.Test;
21 import org.orekit.data.DataContext;
22 import org.orekit.errors.OrekitException;
23 import org.orekit.errors.OrekitMessages;
24 import org.orekit.gnss.metric.messages.ssr.subtype.SsrIm201;
25 import org.orekit.gnss.metric.messages.ssr.subtype.SsrIm201Data;
26 import org.orekit.gnss.metric.parser.ByteArrayEncodedMessage;
27 import org.orekit.gnss.metric.parser.EncodedMessage;
28 import org.orekit.gnss.metric.parser.IgsSsrMessagesParser;
29
30 import java.util.ArrayList;
31
32 public class SsrIm201Test {
33
34 private double eps = 1.0e-13;
35
36 @Test
37 public void testPerfectValue() {
38
39 final String m = "010000100100" +
40 "001" +
41 "11001001" +
42 "01111110011000111111" +
43 "0101" +
44 "0" +
45 "0111" +
46 "0000111101101111" +
47 "0001" +
48 "000000001" +
49 "00" +
50 "01000001" +
51 "0010" +
52 "0001" +
53 "0100101000101101"+
54 "0101011001101101"+
55 "0110101010001100"+
56 "0100001100101111"+
57 "0100101011101101"+
58 "0100101000111110"+
59 "0010100110101101"+
60 "0000111101101101"+
61 "0111101000101100"+
62 "0111101110101101"+
63 "0000101000101100"+
64 "0110101000101001"+
65 "0110101000100100"+
66 "001100100010110100000";
67
68 final EncodedMessage message = new ByteArrayEncodedMessage(byteArrayFromBinary(m));
69 message.start();
70
71 ArrayList<Integer> messages = new ArrayList<>();
72 messages.add(201);
73
74 final SsrIm201 im201 = (SsrIm201) new IgsSsrMessagesParser(messages, DataContext.getDefault().getTimeScales()).
75 parse(message, false);
76
77
78 Assertions.assertNotNull(im201.getIonosphericModel());
79
80
81 Assertions.assertEquals(1, im201.getData().size());
82
83
84 Assertions.assertEquals(201, im201.getTypeCode());
85 Assertions.assertEquals(517695.0, im201.getHeader().getSsrEpoch1s(), eps);
86 Assertions.assertEquals(30.0, im201.getHeader().getSsrUpdateInterval(), eps);
87 Assertions.assertEquals(0, im201.getHeader().getSsrMultipleMessageIndicator());
88 Assertions.assertEquals(7, im201.getHeader().getIodSsr());
89 Assertions.assertEquals(3951, im201.getHeader().getSsrProviderId());
90 Assertions.assertEquals(1, im201.getHeader().getSsrSolutionId());
91 Assertions.assertEquals(0.05, im201.getHeader().getVtecQualityIndicator(), eps);
92 Assertions.assertEquals(1, im201.getHeader().getNumberOfIonosphericLayers());
93
94
95 final SsrIm201Data data = im201.getData().get(0);
96 final double[][] cnm = data.getCnm();
97 final double[][] snm = data.getSnm();
98 Assertions.assertEquals(650000, data.getHeightIonosphericLayer(), eps);
99 Assertions.assertEquals(3, data.getSphericalHarmonicsDegree());
100 Assertions.assertEquals(2, data.getSphericalHarmonicsOrder());
101 Assertions.assertEquals(94.945, cnm[0][0], eps);
102 Assertions.assertEquals(110.625, cnm[1][0], eps);
103 Assertions.assertEquals(136.380, cnm[2][0], eps);
104 Assertions.assertEquals(85.995, cnm[3][0], eps);
105 Assertions.assertEquals(0.0, cnm[0][1], eps);
106 Assertions.assertEquals(95.905, cnm[1][1], eps);
107 Assertions.assertEquals(95.030, cnm[2][1], eps);
108 Assertions.assertEquals(53.345, cnm[3][1], eps);
109 Assertions.assertEquals(0.0, cnm[0][2], eps);
110 Assertions.assertEquals(0.0, cnm[1][2], eps);
111 Assertions.assertEquals(19.745, cnm[2][2], eps);
112 Assertions.assertEquals(156.380, cnm[3][2], eps);
113 Assertions.assertEquals(0.0, snm[0][0], eps);
114 Assertions.assertEquals(0.0, snm[1][0], eps);
115 Assertions.assertEquals(0.0, snm[2][0], eps);
116 Assertions.assertEquals(0.0, snm[3][0], eps);
117 Assertions.assertEquals(0.0, snm[0][1], eps);
118 Assertions.assertEquals(158.305, snm[1][1], eps);
119 Assertions.assertEquals(13.020, snm[2][1], eps);
120 Assertions.assertEquals(135.885, snm[3][1], eps);
121 Assertions.assertEquals(0.0, snm[0][2], eps);
122 Assertions.assertEquals(0.0, snm[1][2], eps);
123 Assertions.assertEquals(135.860, snm[2][2], eps);
124 Assertions.assertEquals(64.225, snm[3][2], eps);
125
126 }
127
128 @Test
129 public void testPerfectValue2() {
130
131 final String m = "010000100100" +
132 "001" +
133 "11001001" +
134 "01111110011000111111" +
135 "1110" +
136 "0" +
137 "0111" +
138 "0000111101101111" +
139 "0001" +
140 "000000001" +
141 "00" +
142 "01000001" +
143 "0010" +
144 "0001" +
145 "0100101000101101"+
146 "0101011001101101"+
147 "0110101010001100"+
148 "0100001100101111"+
149 "0100101011101101"+
150 "0100101000111110"+
151 "0010100110101101"+
152 "0000111101101101"+
153 "0111101000101100"+
154 "0111101110101101"+
155 "0000101000101100"+
156 "0110101000101001"+
157 "0110101000100100"+
158 "001100100010110100000";
159
160 final EncodedMessage message = new ByteArrayEncodedMessage(byteArrayFromBinary(m));
161 message.start();
162
163 ArrayList<Integer> messages = new ArrayList<>();
164 messages.add(201);
165
166 final SsrIm201 im201 = (SsrIm201) new IgsSsrMessagesParser(messages, DataContext.getDefault().getTimeScales()).
167 parse(message, false);
168
169
170 Assertions.assertEquals(1, im201.getData().size());
171
172
173 Assertions.assertEquals(201, im201.getTypeCode());
174 Assertions.assertEquals(517695.0, im201.getHeader().getSsrEpoch1s(), eps);
175 Assertions.assertEquals(7200.0, im201.getHeader().getSsrUpdateInterval(), eps);
176 Assertions.assertEquals(0, im201.getHeader().getSsrMultipleMessageIndicator());
177 Assertions.assertEquals(7, im201.getHeader().getIodSsr());
178 Assertions.assertEquals(3951, im201.getHeader().getSsrProviderId());
179 Assertions.assertEquals(1, im201.getHeader().getSsrSolutionId());
180 Assertions.assertEquals(0.05, im201.getHeader().getVtecQualityIndicator(), eps);
181 Assertions.assertEquals(1, im201.getHeader().getNumberOfIonosphericLayers());
182
183
184 final SsrIm201Data data = im201.getData().get(0);
185 final double[][] cnm = data.getCnm();
186 final double[][] snm = data.getSnm();
187 Assertions.assertEquals(650000, data.getHeightIonosphericLayer(), eps);
188 Assertions.assertEquals(3, data.getSphericalHarmonicsDegree());
189 Assertions.assertEquals(2, data.getSphericalHarmonicsOrder());
190 Assertions.assertEquals(94.945, cnm[0][0], eps);
191 Assertions.assertEquals(110.625, cnm[1][0], eps);
192 Assertions.assertEquals(136.380, cnm[2][0], eps);
193 Assertions.assertEquals(85.995, cnm[3][0], eps);
194 Assertions.assertEquals(0.0, cnm[0][1], eps);
195 Assertions.assertEquals(95.905, cnm[1][1], eps);
196 Assertions.assertEquals(95.030, cnm[2][1], eps);
197 Assertions.assertEquals(53.345, cnm[3][1], eps);
198 Assertions.assertEquals(0.0, cnm[0][2], eps);
199 Assertions.assertEquals(0.0, cnm[1][2], eps);
200 Assertions.assertEquals(19.745, cnm[2][2], eps);
201 Assertions.assertEquals(156.380, cnm[3][2], eps);
202 Assertions.assertEquals(0.0, snm[0][0], eps);
203 Assertions.assertEquals(0.0, snm[1][0], eps);
204 Assertions.assertEquals(0.0, snm[2][0], eps);
205 Assertions.assertEquals(0.0, snm[3][0], eps);
206 Assertions.assertEquals(0.0, snm[0][1], eps);
207 Assertions.assertEquals(158.305, snm[1][1], eps);
208 Assertions.assertEquals(13.020, snm[2][1], eps);
209 Assertions.assertEquals(135.885, snm[3][1], eps);
210 Assertions.assertEquals(0.0, snm[0][2], eps);
211 Assertions.assertEquals(0.0, snm[1][2], eps);
212 Assertions.assertEquals(135.860, snm[2][2], eps);
213 Assertions.assertEquals(64.225, snm[3][2], eps);
214
215 }
216
217 @Test
218 public void testNullMessage() {
219
220 final String m = "010000100100" +
221 "001" +
222 "11001001" +
223 "01111110011000111111" +
224 "0101" +
225 "0" +
226 "0111" +
227 "0000111101101111" +
228 "0001" +
229 "000000001" +
230 "00" +
231 "01000001" +
232 "0010" +
233 "0001" +
234 "0100101000101101"+
235 "0101011001101101"+
236 "0110101010001100"+
237 "0100001100101111"+
238 "0100101011101101"+
239 "0100101000111110"+
240 "0010100110101101"+
241 "0000111101101101"+
242 "0111101000101100"+
243 "0111101110101101"+
244 "0000101000101100"+
245 "0110101000101001"+
246 "0110101000100100"+
247 "001100100010110100000";
248
249
250 final EncodedMessage message = new ByteArrayEncodedMessage(byteArrayFromBinary(m));
251 message.start();
252
253 ArrayList<Integer> messages = new ArrayList<>();
254 messages.add(9999999);
255
256 final SsrIm201 im201 = (SsrIm201) new IgsSsrMessagesParser(messages, DataContext.getDefault().getTimeScales()).
257 parse(message, false);
258
259 Assertions.assertNull(im201);
260 }
261
262 @Test
263 public void testEmptyMessage() {
264 try {
265 final byte[] array = new byte[0];
266 final EncodedMessage emptyMessage = new ByteArrayEncodedMessage(array);
267 new IgsSsrMessagesParser(new ArrayList<>(), DataContext.getDefault().getTimeScales()).
268 parse(emptyMessage, false);
269 Assertions.fail("an exception should have been thrown");
270 } catch (OrekitException oe) {
271 Assertions.assertEquals(OrekitMessages.END_OF_ENCODED_MESSAGE, oe.getSpecifier());
272 }
273
274 }
275
276 private byte[] byteArrayFromBinary(String radix2Value) {
277 final byte[] array = new byte[radix2Value.length() / 8];
278 for (int i = 0; i < array.length; ++i) {
279 for (int j = 0; j < 8; ++j) {
280 if (radix2Value.charAt(8 * i + j) != '0') {
281 array[i] |= 0x1 << (7 - j);
282 }
283 }
284 }
285 return array;
286 }
287
288 }