diff --git a/test/source/scwx/awips/wmo_header.test.cpp b/test/source/scwx/awips/wmo_header.test.cpp new file mode 100644 index 00000000..bdc4406f --- /dev/null +++ b/test/source/scwx/awips/wmo_header.test.cpp @@ -0,0 +1,130 @@ +#include + +#include + +namespace scwx::awips +{ + +static const std::string logPrefix_ = "scwx::awips::wmo_header.test"; + +static const std::string kWmoHeaderSample_ { + "887\n" + "WFUS54 KOUN 280044\n" + "TOROUN"}; + +TEST(WmoHeader, WmoFields) +{ + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + bool valid = header.Parse(ss); + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.sequence_number(), "887"); + EXPECT_EQ(header.data_type(), "WF"); + EXPECT_EQ(header.geographic_designator(), "US"); + EXPECT_EQ(header.bulletin_id(), "54"); + EXPECT_EQ(header.icao(), "KOUN"); + EXPECT_EQ(header.date_time(), "280044"); + EXPECT_EQ(header.bbb_indicator(), ""); + EXPECT_EQ(header.product_category(), "TOR"); + EXPECT_EQ(header.product_designator(), "OUN"); + EXPECT_EQ(header.GetDateTime(), + std::chrono::sys_time {}); +} + +TEST(WmoHeader, DateHintBeforeParse) +{ + using namespace std::chrono; + + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + + header.SetDateHint(2022y / October); + bool valid = header.Parse(ss); + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.GetDateTime(), + sys_days {2022y / October / 28d} + 0h + 44min); +} + +TEST(WmoHeader, DateHintAfterParse) +{ + using namespace std::chrono; + + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + + bool valid = header.Parse(ss); + header.SetDateHint(2022y / October); + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.GetDateTime(), + sys_days {2022y / October / 28d} + 0h + 44min); +} + +TEST(WmoHeader, EndTimeHintSameMonth) +{ + using namespace std::chrono; + + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + + bool valid = header.Parse(ss); + + auto endTimeHint = sys_days {2022y / October / 29d} + 0h + 0min + 0s; + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.GetDateTime(endTimeHint), + sys_days {2022y / October / 28d} + 0h + 44min); +} + +TEST(WmoHeader, EndTimeHintPreviousMonth) +{ + using namespace std::chrono; + + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + + bool valid = header.Parse(ss); + + auto endTimeHint = sys_days {2022y / October / 27d} + 0h + 0min + 0s; + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.GetDateTime(endTimeHint), + sys_days {2022y / September / 28d} + 0h + 44min); +} + +TEST(WmoHeader, EndTimeHintPreviousYear) +{ + using namespace std::chrono; + + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + + bool valid = header.Parse(ss); + + auto endTimeHint = sys_days {2022y / January / 27d} + 0h + 0min + 0s; + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.GetDateTime(endTimeHint), + sys_days {2021y / December / 28d} + 0h + 44min); +} + +TEST(WmoHeader, EndTimeHintIgnored) +{ + using namespace std::chrono; + + std::stringstream ss {kWmoHeaderSample_}; + WmoHeader header; + + header.SetDateHint(2022y / October); + bool valid = header.Parse(ss); + + auto endTimeHint = sys_days {2020y / January / 1d} + 0h + 0min + 0s; + + EXPECT_EQ(valid, true); + EXPECT_EQ(header.GetDateTime(endTimeHint), + sys_days {2022y / October / 28d} + 0h + 44min); +} + +} // namespace scwx::awips diff --git a/test/test.cmake b/test/test.cmake index 64b6c69e..0ae26b53 100644 --- a/test/test.cmake +++ b/test/test.cmake @@ -12,7 +12,8 @@ set(SRC_AWIPS_TESTS source/scwx/awips/coded_location.test.cpp source/scwx/awips/coded_time_motion_location.test.cpp source/scwx/awips/pvtec.test.cpp source/scwx/awips/text_product_file.test.cpp - source/scwx/awips/ugc.test.cpp) + source/scwx/awips/ugc.test.cpp + source/scwx/awips/wmo_header.test.cpp) set(SRC_COMMON_TESTS source/scwx/common/color_table.test.cpp source/scwx/common/products.test.cpp) set(SRC_GR_TESTS source/scwx/gr/placefile.test.cpp)