From b44c293fcaada2239f3d80291b0f6975bbf7f623 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Tue, 23 Jan 2024 01:22:00 +0300 Subject: [PATCH] test: expected sensor filter values --- code/test/unit/CMakeLists.txt | 4 +- code/test/unit/src/filters/filters.cpp | 142 +++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 code/test/unit/src/filters/filters.cpp diff --git a/code/test/unit/CMakeLists.txt b/code/test/unit/CMakeLists.txt index 419eee90..357a2818 100644 --- a/code/test/unit/CMakeLists.txt +++ b/code/test/unit/CMakeLists.txt @@ -192,7 +192,8 @@ list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") function(build_tests) foreach(ARG IN LISTS ARGN) - add_executable(test-${ARG} src/${ARG}/${ARG}.cpp) + file(GLOB ${ARG}_sources "src/${ARG}/*.h" "src/${ARG}/*.cpp") + add_executable(test-${ARG} ${${ARG}_sources}) target_link_libraries(test-${ARG} espurna unity) target_compile_options(test-${ARG} PRIVATE ${COMMON_FLAGS} @@ -213,4 +214,5 @@ build_tests( types url utils + filters ) diff --git a/code/test/unit/src/filters/filters.cpp b/code/test/unit/src/filters/filters.cpp new file mode 100644 index 00000000..f0c8ed9a --- /dev/null +++ b/code/test/unit/src/filters/filters.cpp @@ -0,0 +1,142 @@ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +namespace espurna { +namespace test { +namespace { + +void test_last() { + auto filter = LastFilter(); + + TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + filter.resize(123); + + TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + filter.update(123.4); + TEST_ASSERT_EQUAL_DOUBLE(123.4, filter.value()); + + filter.update(456.7); + TEST_ASSERT_EQUAL_DOUBLE(456.7, filter.value()); + + filter.update(789.0); + TEST_ASSERT_EQUAL_DOUBLE(789.0, filter.value()); + + filter.reset(); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); +} + +void test_max() { + auto filter = MaxFilter(); + + TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + filter.resize(567); + + TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + filter.update(5.0); + TEST_ASSERT_EQUAL_DOUBLE(5.0, filter.value()); + + filter.update(10.0); + TEST_ASSERT_EQUAL_DOUBLE(10.0, filter.value()); + + filter.update(15.0); + TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value()); + + filter.update(10.0); + TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value()); + + filter.update(-10.0); + TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value()); + + filter.update(-15.0); + TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value()); + + filter.update(0.0); + TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value()); + + filter.reset(); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); +} + +void test_median() { + auto filter = MedianFilter(); + TEST_ASSERT_EQUAL(0, filter.capacity()); + + const double samples[] {1., 2., 2., 3., 4., 7., 9.}; + filter.resize(std::size(samples)); + + TEST_ASSERT_EQUAL(std::size(samples), filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + for (const auto& sample : samples) { + filter.update(sample); + } + + TEST_ASSERT_EQUAL_DOUBLE(3.6, filter.value()); +} + +void test_moving_average() { + // TODO +} + +void test_sum() { + auto filter = SumFilter(); + + TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + const double samples[] {20., 20.1, 13., 10., 5., 14., 29., 32.}; + filter.resize(std::size(samples)); + + TEST_ASSERT_EQUAL(1, filter.capacity()); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + for (const auto& sample : samples) { + filter.update(sample); + } + + TEST_ASSERT_EQUAL_DOUBLE(143.1, filter.value()); + + filter.reset(); + TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value()); + + filter.update(-15.0); + filter.update(30.0); + filter.update(-15.0); + filter.update(1.0); + TEST_ASSERT_EQUAL_DOUBLE(1.0, filter.value()); +} + +} // namespace +} // namespace test +} // namespace espurna + +int main(int, char**) { + UNITY_BEGIN(); + using namespace espurna::test; + RUN_TEST(test_last); + RUN_TEST(test_max); + RUN_TEST(test_median); + RUN_TEST(test_moving_average); + RUN_TEST(test_sum); + return UNITY_END(); +} +