diff --git a/tests/blackmisc/testweather.cpp b/tests/blackmisc/testweather.cpp index 7f0e797e8..274022dc1 100644 --- a/tests/blackmisc/testweather.cpp +++ b/tests/blackmisc/testweather.cpp @@ -16,6 +16,10 @@ #include "testweather.h" #include "blackmisc/weather/metardecoder.h" +#include "blackmisc/weather/cloudlayerlist.h" +#include "blackmisc/weather/temperaturelayerlist.h" +#include "blackmisc/weather/visibilitylayerlist.h" +#include "blackmisc/weather/windlayerlist.h" using namespace BlackMisc::Weather; using namespace BlackMisc::Aviation; @@ -32,6 +36,101 @@ namespace BlackMiscTest // void } + void CTestWeather::cloudLayer() + { + const CAltitude base1 { 0, CAltitude::AboveGround, CLengthUnit::ft() }; + const CAltitude top1 { 5000, CAltitude::AboveGround, CLengthUnit::ft() }; + + CCloudLayer cl1 (base1, top1, CCloudLayer::Scattered); + QVERIFY(cl1.getBase() == base1); + QVERIFY(cl1.getTop() == top1); + QVERIFY(cl1.getPrecipitationRate() == 0); + QVERIFY(cl1.getPrecipitation() == CCloudLayer::NoPrecipitation); + QVERIFY(cl1.getClouds() == CCloudLayer::NoClouds); + QVERIFY(cl1.getCoverage() == CCloudLayer::Scattered); + + const CAltitude base2 { 15000, CAltitude::AboveGround, CLengthUnit::ft() }; + const CAltitude top2 { 35000, CAltitude::AboveGround, CLengthUnit::ft() }; + + CCloudLayer cl2 { base2, top2, 5, CCloudLayer::Rain, CCloudLayer::Cirrus, CCloudLayer::Scattered }; + QVERIFY(cl2.getBase() == base2); + QVERIFY(cl2.getTop() == top2); + QVERIFY(cl2.getPrecipitationRate() == 5); + QVERIFY(cl2.getPrecipitation() == CCloudLayer::Rain); + QVERIFY(cl2.getClouds() == CCloudLayer::Cirrus); + QVERIFY(cl2.getCoverage() == CCloudLayer::Scattered); + + const CAltitude base3 { 25000, CAltitude::AboveGround, CLengthUnit::ft() }; + CCloudLayerList cll { cl1, cl2 }; + QVERIFY(cll.containsBase(base1)); + QVERIFY(cll.containsBase(base2)); + QVERIFY(!cll.containsBase(base3)); + QVERIFY(cll.findByBase(base1) != CCloudLayer() ); + QVERIFY(cll.findByBase(base2) != CCloudLayer() ); + QVERIFY(cll.findByBase(base3) == CCloudLayer() ); + } + + void CTestWeather::temperatureLayer() + { + const CAltitude level1 { 0, CAltitude::AboveGround, CLengthUnit::ft() }; + const CTemperature temp1 { 25, CTemperatureUnit::C() }; + const CTemperature dp1 { 15, CTemperatureUnit::C() }; + const int rh = 80; + + CTemperatureLayer tl1 (level1, temp1, dp1, rh); + QVERIFY(tl1.getLevel() == level1); + QVERIFY(tl1.getTemperature() == temp1); + QVERIFY(tl1.getDewPoint() == dp1); + QVERIFY(tl1.getRelativeHumidity() == rh); + + CAltitude level2 { 25000, CAltitude::AboveGround, CLengthUnit::ft() }; + CTemperatureLayerList tll { tl1 }; + QVERIFY(tll.containsLevel(level1)); + QVERIFY(!tll.containsLevel(level2)); + QVERIFY(tll.findByLevel(level1) != CTemperatureLayer() ); + QVERIFY(tll.findByLevel(level2) == CTemperatureLayer() ); + } + + void CTestWeather::visibilityLayer() + { + const CAltitude base1 { 0, CAltitude::AboveGround, CLengthUnit::ft() }; + const CAltitude top1 { 5000, CAltitude::AboveGround, CLengthUnit::ft() }; + const CLength visibility1 { 10, CLengthUnit::SM() }; + + CVisibilityLayer vl1 (base1, top1, visibility1); + QVERIFY(vl1.getBase() == base1); + QVERIFY(vl1.getTop() == top1); + QVERIFY(vl1.getVisibility() == visibility1); + + const CAltitude base2 { 25000, CAltitude::AboveGround, CLengthUnit::ft() }; + CVisibilityLayerList vll { vl1 }; + QVERIFY(vll.containsBase(base1)); + QVERIFY(!vll.containsBase(base2)); + QVERIFY(vll.findByBase(base1) != CVisibilityLayer() ); + QVERIFY(vll.findByBase(base2) == CVisibilityLayer() ); + } + + void CTestWeather::windLayer() + { + const CAltitude level1 { 0, CAltitude::AboveGround, CLengthUnit::ft() }; + const CAngle direction1 { 25, CAngleUnit::deg() }; + const CSpeed speed1 { 10, CSpeedUnit::kts() }; + const CSpeed gustSpeed1 { 20, CSpeedUnit::kts() }; + + CWindLayer wl1 (level1, direction1, speed1, gustSpeed1); + QVERIFY(wl1.getLevel() == level1); + QVERIFY(wl1.getDirection() == direction1); + QVERIFY(wl1.getSpeed() == speed1); + QVERIFY(wl1.getGustSpeed() == gustSpeed1); + + CAltitude level2 { 25000, CAltitude::AboveGround, CLengthUnit::ft() }; + CWindLayerList wll { wl1 }; + QVERIFY(wll.containsLevel(level1)); + QVERIFY(!wll.containsLevel(level2)); + QVERIFY(wll.findByLevel(level1) != CWindLayer() ); + QVERIFY(wll.findByLevel(level2) == CWindLayer() ); + } + void CTestWeather::metarDecoder() { CMetarDecoder metarDecoder; @@ -56,12 +155,12 @@ namespace BlackMiscTest QVERIFY2((presentWeather.getWeatherPhenomena() & CPresentWeather::Snow) == 0, "Weather phenomina 'Snow' should NOT be set"); auto cloudLayers = metar.getCloudLayers(); - QVERIFY2(cloudLayers.containsCeiling(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 4500 ft missing"); - QVERIFY2(cloudLayers.containsCeiling(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 22000 ft missing"); - QVERIFY2(cloudLayers.containsCeiling(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 30000 ft missing"); - QVERIFY2(cloudLayers.findByCeiling(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Few, "Failed to parse cloud layer in 4500 ft"); - QVERIFY2(cloudLayers.findByCeiling(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 22000 ft"); - QVERIFY2(cloudLayers.findByCeiling(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 30000 ft"); + QVERIFY2(cloudLayers.containsBase(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 4500 ft missing"); + QVERIFY2(cloudLayers.containsBase(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 22000 ft missing"); + QVERIFY2(cloudLayers.containsBase(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 30000 ft missing"); + QVERIFY2(cloudLayers.findByBase(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Few, "Failed to parse cloud layer in 4500 ft"); + QVERIFY2(cloudLayers.findByBase(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 22000 ft"); + QVERIFY2(cloudLayers.findByBase(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 30000 ft"); CMetar metar2 = metarDecoder.decode("EDDM 241753Z 20009G11KT 9000NDV FEW045 SCT220 SCT300 ///// Q1013"); QVERIFY2(metar2.getAirportIcaoCode() == CAirportIcaoCode("EDDM"), "Failed to parse airport code"); @@ -79,12 +178,12 @@ namespace BlackMiscTest QVERIFY2(presentWeatherList2.size() == 0, "Present weather has an incorrect size"); auto cloudLayers2 = metar2.getCloudLayers(); - QVERIFY2(cloudLayers2.containsCeiling(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 4500 ft missing"); - QVERIFY2(cloudLayers2.containsCeiling(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 22000 ft missing"); - QVERIFY2(cloudLayers2.containsCeiling(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 30000 ft missing"); - QVERIFY2(cloudLayers2.findByCeiling(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Few, "Failed to parse cloud layer in 4500 ft"); - QVERIFY2(cloudLayers2.findByCeiling(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 22000 ft"); - QVERIFY2(cloudLayers2.findByCeiling(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 30000 ft"); + QVERIFY2(cloudLayers2.containsBase(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 4500 ft missing"); + QVERIFY2(cloudLayers2.containsBase(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 22000 ft missing"); + QVERIFY2(cloudLayers2.containsBase(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())), "Cloud layer 30000 ft missing"); + QVERIFY2(cloudLayers2.findByBase(CAltitude(4500, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Few, "Failed to parse cloud layer in 4500 ft"); + QVERIFY2(cloudLayers2.findByBase(CAltitude(22000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 22000 ft"); + QVERIFY2(cloudLayers2.findByBase(CAltitude(30000, CAltitude::AboveGround, CLengthUnit::ft())).getCoverage() == CCloudLayer::Scattered, "Failed to parse cloud layer in 30000 ft"); } } // namespace diff --git a/tests/blackmisc/testweather.h b/tests/blackmisc/testweather.h index 6989b3984..2833bd5c6 100644 --- a/tests/blackmisc/testweather.h +++ b/tests/blackmisc/testweather.h @@ -32,6 +32,18 @@ namespace BlackMiscTest explicit CTestWeather(QObject *parent = nullptr); private slots: + //! Testing CCloudLayer/CCloudLayerList + void cloudLayer(); + + //! Testing CTemperatureLayer/CTemperatureLayerList + void temperatureLayer(); + + //! Testing CVisibilityLayer/CVisibilityLayerList + void visibilityLayer(); + + //! Testing CWindLayer/CWindLayerList + void windLayer(); + //! Testing METAR decoder void metarDecoder(); };