1 //==============================================================================
2 //
3 // This file is part of GPSTk, the GPS Toolkit.
4 //
5 // The GPSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GPSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GPSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2020, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24
25 //==============================================================================
26 //
27 // This software was developed by Applied Research Laboratories at the
28 // University of Texas at Austin, under contract to an agency or agencies
29 // within the U.S. Department of Defense. The U.S. Government retains all
30 // rights to use, duplicate, distribute, disclose, or release this software.
31 //
32 // Pursuant to DoD Directive 523024
33 //
34 // DISTRIBUTION STATEMENT A: This software has been approved for public
35 // release, distribution is unlimited.
36 //
37 //==============================================================================
38
39 #include "NavID.hpp"
40
41 #include "TestUtil.hpp"
42 #include <iostream>
43 #include <string>
44 #include <sstream>
45 #include <set>
46
47 using namespace std;
48 using namespace gpstk;
49
50 namespace gpstk
51 {
52 // define some stream operators so that test failures involving
53 // enums are a bit more readable.
54
operator <<(std::ostream & s,gpstk::NavType e)55 std::ostream& operator<<(std::ostream& s, gpstk::NavType e)
56 {
57 s << (long)e << " (" << gpstk::StringUtils::asString(e) << ")";
58 return s;
59 }
60 }
61
62 class NavID_T
63 {
64 public:
65 NavID_T();
66 /** Verifies that the NavID objects constructed in NavID_T()
67 * meet expectations */
68 unsigned constructorTest();
69 /** Outputs the different NavID objects to their own
70 * stringstreams and makes sure the results are as expected */
71 unsigned streamOutputTest();
72 /** Makes sure that turning the string names of NavTypes convert
73 * back into their expected values.
74 * @pre streamOutput test must have been executed.
75 */
76 unsigned stringConstructorTest();
77 unsigned inequalityTest();
78 unsigned asStringEnumTest();
79
80 NavID testIDLNAV, testIDCNAVL2, testIDCNAVL5, testIDCNAV2, testIDMNAV,
81 testIDBD1, testIDBD2, testIDGloF, testIDGloC, testIDGalOS, testIDGalOS_2,
82 testIDGalOS_F, testID_IRNSS_SPS, testIDUnkwn;
83 stringstream ln, l2, l5, cnav2, mn, d1, d2, gf, gc, ginv, ginv_2, gfnv, is,
84 un;
85 };
86
87
88 NavID_T ::
NavID_T()89 NavID_T()
90 : testIDLNAV(SatID(1, SatelliteSystem::GPS),
91 ObsID(ObservationType::NavMsg, CarrierBand::L1,
92 TrackingCode::CA)),
93 testIDCNAVL2(SatID(1, SatelliteSystem::GPS),
94 ObsID(ObservationType::NavMsg, CarrierBand::L2,
95 TrackingCode::L2CML)),
96 testIDCNAVL5(SatID(1, SatelliteSystem::GPS),
97 ObsID(ObservationType::NavMsg, CarrierBand::L5,
98 TrackingCode::L5I)),
99 testIDCNAV2(SatID(1, SatelliteSystem::GPS),
100 ObsID(ObservationType::NavMsg, CarrierBand::L1,
101 TrackingCode::L1CDP)),
102 testIDMNAV(SatID(1, SatelliteSystem::GPS),
103 ObsID(ObservationType::NavMsg, CarrierBand::L2,
104 TrackingCode::MDP)),
105 testIDBD1(SatID(6, SatelliteSystem::BeiDou),
106 ObsID(ObservationType::NavMsg, CarrierBand::B1,
107 TrackingCode::B1I)),
108 testIDBD2(SatID(5, SatelliteSystem::BeiDou),
109 ObsID(ObservationType::NavMsg, CarrierBand::B2,
110 TrackingCode::B1I)),
111 testIDGloF(SatID(2, SatelliteSystem::Glonass),
112 ObsID(ObservationType::NavMsg, CarrierBand::G1,
113 TrackingCode::Standard)),
114 testIDGloC(SatID(2, SatelliteSystem::Glonass),
115 ObsID(ObservationType::NavMsg, CarrierBand::G3,
116 TrackingCode::L3OCDP)),
117 testIDGalOS(SatID(2, SatelliteSystem::Galileo),
118 ObsID(ObservationType::NavMsg, CarrierBand::L1,
119 TrackingCode::E1B)),
120 testIDGalOS_2(SatID(2, SatelliteSystem::Galileo),
121 ObsID(ObservationType::NavMsg, CarrierBand::E5b,
122 TrackingCode::E5bI)),
123 testIDGalOS_F(SatID(2, SatelliteSystem::Galileo),
124 ObsID(ObservationType::NavMsg, CarrierBand::L5,
125 TrackingCode::E5aI)),
126 testID_IRNSS_SPS(SatID(2, SatelliteSystem::IRNSS),
127 ObsID(ObservationType::NavMsg, CarrierBand::L5,
128 TrackingCode::SPSL5)),
129 testIDUnkwn(SatID(1, SatelliteSystem::GPS),
130 ObsID(ObservationType::NavMsg, CarrierBand::L5,
131 TrackingCode::MDP))
132 {
133 }
134
135
136 unsigned NavID_T ::
constructorTest()137 constructorTest()
138 {
139 TUDEF("NavID", "NavID()");
140
141 NavID dfltTest;
142 TUASSERTE(gpstk::NavType, NavType::Unknown, dfltTest.navType);
143
144 //GPS LNAV
145 TUCSM("NavID(SatID,ObsID)");
146 TUASSERTE(gpstk::NavType, NavType::GPSLNAV, testIDLNAV.navType);
147
148 //GPS CNAV L2
149 TUASSERTE(gpstk::NavType, NavType::GPSCNAVL2, testIDCNAVL2.navType);
150
151 //GPS CNAV L5
152 TUASSERTE(gpstk::NavType, NavType::GPSCNAVL5, testIDCNAVL5.navType);
153
154 //GPS CNAV2
155 TUASSERTE(gpstk::NavType, NavType::GPSCNAV2, testIDCNAV2.navType);
156
157 //GPS MNAV
158 TUASSERTE(gpstk::NavType, NavType::GPSMNAV, testIDMNAV.navType);
159
160 //Beidou D1
161 TUASSERTE(gpstk::NavType, NavType::BeiDou_D1, testIDBD1.navType);
162
163 //Beidou D2
164 TUASSERTE(gpstk::NavType, NavType::BeiDou_D2, testIDBD2.navType);
165
166 //Glonass Civil F
167 TUASSERTE(gpstk::NavType, NavType::GloCivilF, testIDGloF.navType);
168
169 //Glonass Civil C
170 TUASSERTE(gpstk::NavType, NavType::GloCivilC, testIDGloC.navType);
171
172 //Galileo Open Sys
173 TUASSERTE(gpstk::NavType, NavType::GalINAV, testIDGalOS.navType);
174
175 TUASSERTE(gpstk::NavType, NavType::GalINAV, testIDGalOS_2.navType);
176
177 TUASSERTE(gpstk::NavType, NavType::GalFNAV, testIDGalOS_F.navType);
178
179 //IRNSS L5 SPS
180 TUASSERTE(gpstk::NavType, NavType::IRNSS_SPS, testID_IRNSS_SPS.navType);
181
182 //Unknown
183 TUASSERTE(gpstk::NavType, NavType::Unknown, testIDUnkwn.navType);
184
185 TURETURN();
186 }
187
188
189 unsigned NavID_T ::
streamOutputTest()190 streamOutputTest()
191 {
192 TUDEF("NavID", "operator<<");
193
194 ln << testIDLNAV;
195 TUASSERTE(std::string, "GPS_LNAV", ln.str());
196
197 l2 << testIDCNAVL2;
198 TUASSERTE(std::string, "GPS_CNAV_L2", l2.str());
199
200 l5 << testIDCNAVL5;
201 TUASSERTE(std::string, "GPS_CNAV_L5", l5.str());
202
203 cnav2 << testIDCNAV2;
204 TUASSERTE(std::string, "GPS_CNAV2", cnav2.str());
205
206 mn << testIDMNAV;
207 TUASSERTE(std::string, "GPS_MNAV", mn.str());
208
209 d1 << testIDBD1;
210 TUASSERTE(std::string, "Beidou_D1", d1.str());
211
212 d2 << testIDBD2;
213 TUASSERTE(std::string, "Beidou_D2", d2.str());
214
215 gf << testIDGloF;
216 TUASSERTE(std::string, "GloCivilF", gf.str());
217
218 gc << testIDGloC;
219 TUASSERTE(std::string, "GloCivilC", gc.str());
220
221 ginv << testIDGalOS;
222 TUASSERTE(std::string, "GalINAV", ginv.str());
223
224 ginv_2 << testIDGalOS_2;
225 TUASSERTE(std::string, "GalINAV", ginv_2.str());
226
227 gfnv << testIDGalOS_F;
228 TUASSERTE(std::string, "GalFNAV", gfnv.str());
229
230 is << testID_IRNSS_SPS;
231 TUASSERTE(std::string, "IRNSS_SPS", is.str());
232
233 un << testIDUnkwn;
234 TUASSERTE(std::string, "Unknown", un.str());
235
236 TURETURN();
237 }
238
239
240 unsigned NavID_T ::
stringConstructorTest()241 stringConstructorTest()
242 {
243 TUDEF("NavID", "NavID(string)");
244
245 NavID testIDLNAVString(ln.str());
246 TUASSERTE(gpstk::NavType, NavType::GPSLNAV, testIDLNAVString.navType);
247
248 NavID testIDCNAVL2String(l2.str());
249 TUASSERTE(gpstk::NavType, NavType::GPSCNAVL2, testIDCNAVL2String.navType);
250
251 NavID testIDCNAVL5String(l5.str());
252 TUASSERTE(gpstk::NavType, NavType::GPSCNAVL5, testIDCNAVL5String.navType);
253
254 NavID testIDCNAV2String(cnav2.str());
255 TUASSERTE(gpstk::NavType, NavType::GPSCNAV2, testIDCNAV2String.navType);
256
257 NavID testIDMNAVString(mn.str());
258 TUASSERTE(gpstk::NavType, NavType::GPSMNAV, testIDMNAVString.navType);
259
260 NavID testIDBD1String(d1.str());
261 TUASSERTE(gpstk::NavType, NavType::BeiDou_D1, testIDBD1String.navType);
262
263 NavID testIDBD2String(d2.str());
264 TUASSERTE(gpstk::NavType, NavType::BeiDou_D2, testIDBD2String.navType);
265
266 NavID testIDGloFString(gf.str());
267 TUASSERTE(gpstk::NavType, NavType::GloCivilF, testIDGloFString.navType);
268
269 NavID testIDGloCString(gc.str());
270 TUASSERTE(gpstk::NavType, NavType::GloCivilC, testIDGloCString.navType);
271
272 NavID testIDGalOSStringI(ginv.str());
273 TUASSERTE(gpstk::NavType, NavType::GalINAV, testIDGalOSStringI.navType);
274
275 NavID testIDGalOSStringF(gfnv.str());
276 TUASSERTE(gpstk::NavType, NavType::GalFNAV, testIDGalOSStringF.navType);
277
278 NavID testID_IRNSS_SPS_String(is.str());
279 TUASSERTE(gpstk::NavType,NavType::IRNSS_SPS,testID_IRNSS_SPS_String.navType);
280
281 NavID testIDUnkwnString(un.str());
282 TUASSERTE(gpstk::NavType, NavType::Unknown, testIDUnkwnString.navType);
283
284 TURETURN();
285 }
286
287
288 unsigned NavID_T ::
inequalityTest()289 inequalityTest()
290 {
291 TUDEF("NavID", "operator!=");
292
293 set<NavID> testSet;
294 //Insert NavTypes into set in backward order.
295 // This implicitly tests operator<
296 testSet.insert(testIDUnkwn);
297 testSet.insert(testID_IRNSS_SPS);
298 testSet.insert(testIDGalOS);
299 testSet.insert(testIDGalOS_F);
300 testSet.insert(testIDGloC);
301 testSet.insert(testIDGloF);
302 testSet.insert(testIDBD2);
303 testSet.insert(testIDBD1);
304 testSet.insert(testIDMNAV);
305 testSet.insert(testIDCNAV2);
306 testSet.insert(testIDCNAVL5);
307 testSet.insert(testIDCNAVL2);
308 testSet.insert(testIDLNAV);
309
310 //Instantiate currTest as GPS_LNAV by
311 //instantiating navType as ntGPSLNAV.
312 NavID currTest;
313 currTest.navType = NavType::GPSLNAV;
314
315 //Set nid equal to dereferenced NavID set iterator; should
316 //initially correspond to first location in set (@ value GPS_LNAV).
317 //Compare to currTest which initially corresponds to NavID for first
318 //location in NavType enum (ntGPSLNAV).
319 for (const auto& nid : testSet)
320 {
321 TUASSERTE(gpstk::NavID, currTest, nid);
322 currTest.navType = static_cast<gpstk::NavType>((int)currTest.navType + 1);
323 }
324
325 TURETURN();
326 }
327
328
329 unsigned NavID_T ::
asStringEnumTest()330 asStringEnumTest()
331 {
332 TUDEF("NavID", "asString");
333 // These tests verify that every enum has a string
334 // representation and every string has a corresponding enum.
335 // It also implicitly verifies that the string
336 // representations aren't duplicated, since if two enums
337 // translated to string "XXX", the attempt to reverse the
338 // translation would fail.
339 for (gpstk::NavType nt : NavTypeIterator())
340 {
341 std::string s;
342 TUCATCH(s = gpstk::StringUtils::asString(nt));
343 TUASSERT(!s.empty());
344 if (nt != gpstk::NavType::Unknown)
345 TUASSERT(s != "Unknown");
346 gpstk::NavType nt2;
347 TUCATCH(nt2 = gpstk::StringUtils::asNavType(s));
348 TUASSERTE(gpstk::NavType, nt, nt2);
349 }
350 TURETURN();
351 }
352
main()353 int main()
354 {
355 unsigned errorTotal = 0;
356 NavID_T testClass;
357
358 errorTotal += testClass.constructorTest();
359 errorTotal += testClass.streamOutputTest();
360 errorTotal += testClass.stringConstructorTest();
361 errorTotal += testClass.inequalityTest();
362
363 std::cout << "Total Failures for " << __FILE__ << ": " << errorTotal
364 << std::endl;
365
366 return errorTotal;
367 }
368
369