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