Files
PX4-Autopilot/unittests/hysteresis_test.cpp
T
Julian Oes f365832c0b hysteresis: we needed different hysteresis
Sometimes, we only need a histeresis in one direction.
2016-07-30 12:26:56 +02:00

154 lines
3.9 KiB
C++

#include <systemlib/hysteresis/hysteresis.h>
#include "gtest/gtest.h"
TEST(HysteresisTest, InitFalse)
{
systemlib::Hysteresis hysteresis(false);
ASSERT_FALSE(hysteresis.get_state());
}
TEST(HysteresisTest, InitTrue)
{
systemlib::Hysteresis hysteresis(true);
ASSERT_TRUE(hysteresis.get_state());
}
TEST(HysteresisTest, ZeroCase)
{
// Default is 0 hysteresis.
systemlib::Hysteresis hysteresis(false);
ASSERT_FALSE(hysteresis.get_state());
// Change and see result immediately.
hysteresis.set_state_and_update(true);
ASSERT_TRUE(hysteresis.get_state());
hysteresis.set_state_and_update(false);
ASSERT_FALSE(hysteresis.get_state());
hysteresis.set_state_and_update(true);
ASSERT_TRUE(hysteresis.get_state());
// A wait won't change anything.
usleep(1000);
hysteresis.update();
ASSERT_TRUE(hysteresis.get_state());
}
TEST(HysteresisTest, ChangeAfterTime)
{
systemlib::Hysteresis hysteresis(false);
hysteresis.set_hysteresis_time_from(false, 5000);
hysteresis.set_hysteresis_time_from(true, 3000);
// Change to true.
hysteresis.set_state_and_update(true);
ASSERT_FALSE(hysteresis.get_state());
usleep(4000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
usleep(2000);
hysteresis.update();
ASSERT_TRUE(hysteresis.get_state());
// Change back to false.
hysteresis.set_state_and_update(false);
ASSERT_TRUE(hysteresis.get_state());
usleep(1000);
hysteresis.update();
ASSERT_TRUE(hysteresis.get_state());
usleep(3000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
}
TEST(HysteresisTest, HysteresisChanged)
{
systemlib::Hysteresis hysteresis(false);
hysteresis.set_hysteresis_time_from(true, 2000);
hysteresis.set_hysteresis_time_from(false, 5000);
// Change to true.
hysteresis.set_state_and_update(true);
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.update();
ASSERT_TRUE(hysteresis.get_state());
// Change hysteresis time.
hysteresis.set_hysteresis_time_from(true, 10000);
// Change back to false.
hysteresis.set_state_and_update(false);
ASSERT_TRUE(hysteresis.get_state());
usleep(7000);
hysteresis.update();
ASSERT_TRUE(hysteresis.get_state());
usleep(5000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
}
TEST(HysteresisTest, ChangeAfterTimeMultipleSets)
{
systemlib::Hysteresis hysteresis(false);
hysteresis.set_hysteresis_time_from(true, 5000);
hysteresis.set_hysteresis_time_from(false, 5000);
// Change to true.
hysteresis.set_state_and_update(true);
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.set_state_and_update(true);
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.set_state_and_update(true);
ASSERT_TRUE(hysteresis.get_state());
// Change to false.
hysteresis.set_state_and_update(false);
ASSERT_TRUE(hysteresis.get_state());
usleep(3000);
hysteresis.set_state_and_update(false);
ASSERT_TRUE(hysteresis.get_state());
usleep(3000);
hysteresis.set_state_and_update(false);
ASSERT_FALSE(hysteresis.get_state());
}
TEST(HysteresisTest, TakeChangeBack)
{
systemlib::Hysteresis hysteresis(false);
hysteresis.set_hysteresis_time_from(false, 5000);
// Change to true.
hysteresis.set_state_and_update(true);
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
// Change your mind to false.
hysteresis.set_state_and_update(false);
ASSERT_FALSE(hysteresis.get_state());
usleep(6000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
// And true again
hysteresis.set_state_and_update(true);
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.update();
ASSERT_FALSE(hysteresis.get_state());
usleep(3000);
hysteresis.update();
ASSERT_TRUE(hysteresis.get_state());
// The other directory is immediate.
hysteresis.set_state_and_update(false);
ASSERT_FALSE(hysteresis.get_state());
}