From 57bc58be8eee7315cbc8de755fbec4a394957b15 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 3 Aug 2024 18:32:48 +0200 Subject: [PATCH] Add duration modifier tests --- tests/CMakeLists.txt | 8 ++ tests/test-duration-modifier.cpp | 139 +++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 tests/test-duration-modifier.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fcc701b6..f574d3a8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -54,6 +54,14 @@ target_sources( ${PROJECT_NAME} PRIVATE test-condition-logic.cpp ${ADVSS_SOURCE_DIR}/lib/utils/condition-logic.cpp) +# --- duration-modifier --- # + +target_sources( + ${PROJECT_NAME} + PRIVATE test-duration-modifier.cpp + ${ADVSS_SOURCE_DIR}/lib/utils/duration-modifier.cpp + ${ADVSS_SOURCE_DIR}/lib/utils/duration.cpp) + # --- json --- # target_sources( diff --git a/tests/test-duration-modifier.cpp b/tests/test-duration-modifier.cpp new file mode 100644 index 00000000..3a09a471 --- /dev/null +++ b/tests/test-duration-modifier.cpp @@ -0,0 +1,139 @@ +#include "catch.hpp" + +#include + +#include +#include + +TEST_CASE("Test modifier NONE", "[duration-modifier]") +{ + advss::DurationModifier durationModifier; + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + + // Duration should not affect the condition outcome with Type::NONE + durationModifier.SetDuration(1.0); + + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); +} + +TEST_CASE("Test modifier MORE", "[duration-modifier]") +{ + using namespace std::chrono_literals; + advss::DurationModifier durationModifier; + durationModifier.SetModifier(advss::DurationModifier::Type::MORE); + durationModifier.SetDuration(.1); + durationModifier.ResetDuration(); + + // Should only return true after 100ms have passed + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + std::this_thread::sleep_for(50ms); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + std::this_thread::sleep_for(100ms); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + + // Should return false for at 100ms as soon as "false" is passed + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + std::this_thread::sleep_for(50ms); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + std::this_thread::sleep_for(100ms); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); +} + +TEST_CASE("Test modifier EQUAL", "[duration-modifier]") +{ + using namespace std::chrono_literals; + advss::DurationModifier durationModifier; + durationModifier.SetModifier(advss::DurationModifier::Type::EQUAL); + durationModifier.SetDuration(.1); + durationModifier.ResetDuration(); + + // Return false value if duration is not reached + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + + std::this_thread::sleep_for(50ms); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + + // Should return true only once after duration + std::this_thread::sleep_for(100ms); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + + // Should reset to original behavior as soon as false is passed after + // duration was reached + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); +} + +TEST_CASE("Test modifier LESS", "[duration-modifier]") +{ + using namespace std::chrono_literals; + advss::DurationModifier durationModifier; + durationModifier.SetModifier(advss::DurationModifier::Type::LESS); + durationModifier.SetDuration(.1); + durationModifier.ResetDuration(); + + // Return input value if duration is not reached + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + + std::this_thread::sleep_for(50ms); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + + // Should return false after duration is reached even if true is passed + std::this_thread::sleep_for(100ms); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(true)); + + // Should reset to original behavior as soon as false is passed after + // duration was reached + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); +} + +TEST_CASE("Test modifier WITHIN", "[duration-modifier]") +{ + using namespace std::chrono_literals; + advss::DurationModifier durationModifier; + durationModifier.SetModifier(advss::DurationModifier::Type::WITHIN); + durationModifier.SetDuration(.1); + durationModifier.ResetDuration(); + + // Return false value if true was not passed in given time frame + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + + // Passing true should always return true + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + + // Passing true or false when true was passed at least once in the given + // time frame should always return true + std::this_thread::sleep_for(50ms); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(false)); + + // Should reset to original behavior if true was not passed within the + // given time frame + std::this_thread::sleep_for(150ms); + REQUIRE_FALSE( + durationModifier.CheckConditionWithDurationModifier(false)); + REQUIRE(durationModifier.CheckConditionWithDurationModifier(true)); +}