Browse Source

test: expected sensor filter values

dev
Maxim Prokhorov 3 months ago
parent
commit
b44c293fca
2 changed files with 145 additions and 1 deletions
  1. +3
    -1
      code/test/unit/CMakeLists.txt
  2. +142
    -0
      code/test/unit/src/filters/filters.cpp

+ 3
- 1
code/test/unit/CMakeLists.txt View File

@ -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
)

+ 142
- 0
code/test/unit/src/filters/filters.cpp View File

@ -0,0 +1,142 @@
#include <unity.h>
#include <Arduino.h>
#include <StreamString.h>
#include <ArduinoJson.h>
#include <espurna/filters/LastFilter.h>
#include <espurna/filters/MaxFilter.h>
#include <espurna/filters/MedianFilter.h>
#include <espurna/filters/MovingAverageFilter.h>
#include <espurna/filters/SumFilter.h>
#include <algorithm>
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();
}

Loading…
Cancel
Save