32 using namespace swift::misc::weather;
33 using namespace swift::misc::aviation;
34 using namespace swift::misc::physical_quantities;
54 void CTestWeather::cloudLayer()
56 const CAltitude base1 { 0, CAltitude::AboveGround, CLengthUnit::ft() };
57 const CAltitude top1 { 5000, CAltitude::AboveGround, CLengthUnit::ft() };
59 CCloudLayer cl1(base1, top1, CCloudLayer::Scattered);
60 QVERIFY(cl1.getBase() == base1);
61 QVERIFY(cl1.getTop() == top1);
62 QCOMPARE(cl1.getPrecipitationRate(), 0.0);
63 QVERIFY(cl1.getPrecipitation() == CCloudLayer::NoPrecipitation);
64 QVERIFY(cl1.getClouds() == CCloudLayer::NoClouds);
65 QVERIFY(cl1.getCoverage() == CCloudLayer::Scattered);
67 const CAltitude base2 { 15000, CAltitude::AboveGround, CLengthUnit::ft() };
68 const CAltitude top2 { 35000, CAltitude::AboveGround, CLengthUnit::ft() };
70 CCloudLayer cl2 { base2, top2, 5, CCloudLayer::Rain, CCloudLayer::Cirrus, CCloudLayer::Scattered };
71 QVERIFY(cl2.getBase() == base2);
72 QVERIFY(cl2.getTop() == top2);
73 QCOMPARE(cl2.getPrecipitationRate(), 5.0);
74 QVERIFY(cl2.getPrecipitation() == CCloudLayer::Rain);
75 QVERIFY(cl2.getClouds() == CCloudLayer::Cirrus);
76 QVERIFY(cl2.getCoverage() == CCloudLayer::Scattered);
78 const CAltitude base3 { 25000, CAltitude::AboveGround, CLengthUnit::ft() };
80 QVERIFY(cll.containsBase(base1));
81 QVERIFY(cll.containsBase(base2));
82 QVERIFY(!cll.containsBase(base3));
88 void CTestWeather::windLayer()
90 const CAltitude level1 { 0, CAltitude::AboveGround, CLengthUnit::ft() };
91 const CAngle direction1 { 25, CAngleUnit::deg() };
92 const CSpeed speed1 { 10, CSpeedUnit::kts() };
93 const CSpeed gustSpeed1 { 20, CSpeedUnit::kts() };
95 CWindLayer wl1(level1, direction1, speed1, gustSpeed1);
96 QVERIFY(wl1.getLevel() == level1);
97 QVERIFY(wl1.getDirection() == direction1);
98 QVERIFY(wl1.getSpeed() == speed1);
99 QVERIFY(wl1.getGustSpeed() == gustSpeed1);
101 CAltitude level2 { 25000, CAltitude::AboveGround, CLengthUnit::ft() };
103 QVERIFY(wll.containsLevel(level1));
104 QVERIFY(!wll.containsLevel(level2));
105 QVERIFY(wll.findByLevel(level1) !=
CWindLayer());
106 QVERIFY(wll.findByLevel(level2) ==
CWindLayer());
109 void CTestWeather::metarDecoder()
112 CMetar metar = metarDecoder.
decode(
"KLBB 241753Z 20009KT 10SM -SHRA FEW045 SCT220 SCT300 28/17 A3022");
114 QVERIFY2(metar.
getDay() == 24,
"Failed to parse day of report");
115 QVERIFY2(metar.
getTime() ==
CTime(17, 53, 0),
"Failed to parse time of report");
117 "Failed to parse wind direction");
120 QVERIFY2(metar.
getVisibility() ==
CLength(10, CLengthUnit::SM()),
"Failed to parse visibility");
123 QVERIFY2(metar.
getAltimeter() ==
CPressure(30.22, CPressureUnit::inHg()),
"Failed to parse altimeter");
126 QVERIFY2(presentWeatherList.size() == 1,
"Present weather has an incorrect size");
127 auto presentWeather = presentWeatherList.frontOrDefault();
128 QVERIFY2(presentWeather.getIntensity() == CPresentWeather::Light,
"Itensity should be light");
129 QVERIFY2(presentWeather.getDescriptor() == CPresentWeather::Showers,
"Descriptor should be showers");
130 QVERIFY2(presentWeather.getWeatherPhenomena() & CPresentWeather::Rain,
131 "Weather phenomina 'rain' should be set");
132 QVERIFY2((presentWeather.getWeatherPhenomena() & CPresentWeather::Snow) == 0,
133 "Weather phenomina 'Snow' should NOT be set");
136 QVERIFY2(cloudLayers.containsBase(
CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())),
137 "Cloud layer 4500 ft missing");
138 QVERIFY2(cloudLayers.containsBase(
CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())),
139 "Cloud layer 22000 ft missing");
140 QVERIFY2(cloudLayers.containsBase(
CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())),
141 "Cloud layer 30000 ft missing");
142 QVERIFY2(cloudLayers.findByBase(
CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() ==
144 "Failed to parse cloud layer in 4500 ft");
145 QVERIFY2(cloudLayers.findByBase(
CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() ==
146 CCloudLayer::Scattered,
147 "Failed to parse cloud layer in 22000 ft");
148 QVERIFY2(cloudLayers.findByBase(
CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() ==
149 CCloudLayer::Scattered,
150 "Failed to parse cloud layer in 30000 ft");
152 CMetar metar2 = metarDecoder.
decode(
"EDDM 241753Z 20009G11KT 9000NDV FEW045 SCT220 SCT300 ///// Q1013");
154 QVERIFY2(metar2.
getDay() == 24,
"Failed to parse day of report");
155 QVERIFY2(metar2.
getTime() ==
CTime(17, 53, 0),
"Failed to parse time of report");
157 "Failed to parse wind direction");
160 "Wind gust speed should be null");
161 QVERIFY2(metar2.
getVisibility() ==
CLength(9000, CLengthUnit::m()),
"Failed to parse visibility");
164 QVERIFY2(metar2.
getAltimeter() ==
CPressure(1013, CPressureUnit::hPa()),
"Failed to parse altimeter");
167 QVERIFY2(presentWeatherList2.size() == 0,
"Present weather has an incorrect size");
170 QVERIFY2(cloudLayers2.containsBase(
CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())),
171 "Cloud layer 4500 ft missing");
172 QVERIFY2(cloudLayers2.containsBase(
CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())),
173 "Cloud layer 22000 ft missing");
174 QVERIFY2(cloudLayers2.containsBase(
CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())),
175 "Cloud layer 30000 ft missing");
176 QVERIFY2(cloudLayers2.findByBase(
CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() ==
178 "Failed to parse cloud layer in 4500 ft");
179 QVERIFY2(cloudLayers2.findByBase(
CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() ==
180 CCloudLayer::Scattered,
181 "Failed to parse cloud layer in 22000 ft");
182 QVERIFY2(cloudLayers2.findByBase(
CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() ==
183 CCloudLayer::Scattered,
184 "Failed to parse cloud layer in 30000 ft");
192 #include "testweather.moc"
Value object encapsulating information of airport ICAO data.
Altitude as used in aviation, can be AGL or MSL altitude.
Physical unit angle (radians, degrees)
Physical unit length (length)
Physical unit temperature.
Value object for a cloud layer.
Value object encapsulating a set of cloud layers.
Value object for a wind layer.
physical_quantities::CSpeed getGustSpeed() const
Get weather phenomenas.
physical_quantities::CSpeed getSpeed() const
Get descriptor.
physical_quantities::CAngle getDirection() const
Get direction.
Value object encapsulating a set of wind layers.
SWIFTTEST_APPLESS_MAIN(MiscTest::CTestWeather)
main