From c9c509deed67f6219b10758f969715d3e43b17a0 Mon Sep 17 00:00:00 2001 From: Ryan Blue Date: Fri, 25 Oct 2024 04:18:36 -0400 Subject: [PATCH] Add C++ tests --- wpilibc/src/test/native/cpp/AlertsTest.cpp | 107 +++++++++++++++++---- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/wpilibc/src/test/native/cpp/AlertsTest.cpp b/wpilibc/src/test/native/cpp/AlertsTest.cpp index 947e7423d00..fa215529473 100644 --- a/wpilibc/src/test/native/cpp/AlertsTest.cpp +++ b/wpilibc/src/test/native/cpp/AlertsTest.cpp @@ -3,6 +3,7 @@ // the WPILib BSD license file in the root directory of this project. #include +#include #include #include @@ -20,9 +21,11 @@ using enum Alert::AlertType; class AlertsTest : public ::testing::Test { public: ~AlertsTest() { - EXPECT_EQ(GetSubscriberForType(kError).Get().size(), 0); - EXPECT_EQ(GetSubscriberForType(kWarning).Get().size(), 0); - EXPECT_EQ(GetSubscriberForType(kInfo).Get().size(), 0); + // test all destructors + Update(); + EXPECT_EQ(GetSubscriberForType(kError).Get().size(), 0ul); + EXPECT_EQ(GetSubscriberForType(kWarning).Get().size(), 0ul); + EXPECT_EQ(GetSubscriberForType(kInfo).Get().size(), 0ul); } template @@ -37,12 +40,18 @@ class AlertsTest : public ::testing::Test { testInfo->test_case_name()); } + // todo: this + void ExpectAlertsState() {} + bool IsAlertActive(std::string_view text, Alert::AlertType type) { - std::vector activeAlerts = GetSubscriberForType(type).Get(); + Update(); + auto activeAlerts = GetSubscriberForType(type).Get(); return std::find(activeAlerts.begin(), activeAlerts.end(), text) != activeAlerts.end(); } + void Update() { frc::SmartDashboard::UpdateValues(); } + private: std::string GetSubtableName(Alert::AlertType type) { switch (type) { @@ -74,20 +83,82 @@ class AlertsTest : public ::testing::Test { } }; -TEST_F(AlertsTest, Constructors) { - // Make and destroy - Alert{GetGroupName(), "One", kError}; - Alert a{GetGroupName(), "Two", kInfo}; - a.Set(true); - a.Set(false); - // Move assign - a = Alert(GetGroupName(), "Three", kWarning); - // Move construct - Alert b{std::move(a)}; +TEST_F(AlertsTest, SetUnset) { + auto one = MakeAlert("one", kError); + auto two = MakeAlert("two", kInfo); + EXPECT_FALSE(IsAlertActive("one", kError)); + EXPECT_FALSE(IsAlertActive("two", kInfo)); + one.Set(true); + EXPECT_TRUE(IsAlertActive("one", kError)); + EXPECT_FALSE(IsAlertActive("two", kInfo)); + one.Set(true); + two.Set(true); + EXPECT_TRUE(IsAlertActive("one", kError)); + EXPECT_TRUE(IsAlertActive("two", kInfo)); + one.Set(false); + EXPECT_FALSE(IsAlertActive("one", kError)); + EXPECT_TRUE(IsAlertActive("two", kInfo)); +} + +TEST_F(AlertsTest, DestructorUnsetsAlert) { { - // Move assign with dynamic string - std::string text = fmt::format( - "{}", std::chrono::steady_clock::now().time_since_epoch().count()); - b = Alert(text, kError); + auto alert = MakeAlert("alert", kWarning); + alert.Set(true); + EXPECT_TRUE(IsAlertActive("alert", kWarning)); } + EXPECT_FALSE(IsAlertActive("alert", kWarning)); +} + +TEST_F(AlertsTest, SetTextWhileUnset) { + auto alert = MakeAlert("BEFORE", kInfo); + EXPECT_EQ("BEFORE", alert.GetText()); + alert.Set(true); + EXPECT_TRUE(IsAlertActive("BEFORE", kInfo)); + alert.Set(false); + EXPECT_FALSE(IsAlertActive("BEFORE", kInfo)); + alert.SetText("AFTER"); + EXPECT_EQ("AFTER", alert.GetText()); + alert.Set(true); + EXPECT_FALSE(IsAlertActive("BEFORE", kInfo)); + EXPECT_TRUE(IsAlertActive("AFTER", kInfo)); +} + +TEST_F(AlertsTest, SetTextWhileSet) { + auto alert = MakeAlert("BEFORE", kInfo); + EXPECT_EQ("BEFORE", alert.GetText()); + alert.Set(true); + EXPECT_TRUE(IsAlertActive("BEFORE", kInfo)); + alert.SetText("AFTER"); + EXPECT_EQ("AFTER", alert.GetText()); + EXPECT_FALSE(IsAlertActive("BEFORE", kInfo)); + EXPECT_TRUE(IsAlertActive("AFTER", kInfo)); +} + +TEST_F(AlertsTest, MoveAssign) { + auto outer = MakeAlert("outer", kInfo); + outer.Set(true); + EXPECT_TRUE(IsAlertActive("outer", kInfo)); + + { + auto inner = MakeAlert("inner", kWarning); + inner.Set(true); + EXPECT_TRUE(IsAlertActive("inner", kWarning)); + outer = std::move(inner); + // Assignment target should be unset and invalidated as part of move, before + // destruction + EXPECT_FALSE(IsAlertActive("outer", kInfo)); + } + EXPECT_TRUE(IsAlertActive("inner", kWarning)); +} + +TEST_F(AlertsTest, MoveConstruct) { + auto a = MakeAlert("A", kInfo); + a.Set(true); + EXPECT_TRUE(IsAlertActive("A", kInfo)); + Alert b{std::move(a)}; + EXPECT_TRUE(IsAlertActive("A", kInfo)); + b.Set(false); + EXPECT_FALSE(IsAlertActive("A", kInfo)); + b.Set(true); + EXPECT_TRUE(IsAlertActive("A", kInfo)); }