Mirror of espurna firmware for wireless switches and more
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
4.3 KiB

  1. #include <unity.h>
  2. #include <Arduino.h>
  3. #include <StreamString.h>
  4. #include <ArduinoJson.h>
  5. #include <espurna/filters/LastFilter.h>
  6. #include <espurna/filters/MaxFilter.h>
  7. #include <espurna/filters/MedianFilter.h>
  8. #include <espurna/filters/MovingAverageFilter.h>
  9. #include <espurna/filters/SumFilter.h>
  10. #include <algorithm>
  11. namespace espurna {
  12. namespace test {
  13. namespace {
  14. void test_last() {
  15. auto filter = LastFilter();
  16. TEST_ASSERT_EQUAL(1, filter.capacity());
  17. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  18. filter.resize(123);
  19. TEST_ASSERT_EQUAL(1, filter.capacity());
  20. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  21. filter.update(123.4);
  22. TEST_ASSERT_EQUAL_DOUBLE(123.4, filter.value());
  23. filter.update(456.7);
  24. TEST_ASSERT_EQUAL_DOUBLE(456.7, filter.value());
  25. filter.update(789.0);
  26. TEST_ASSERT_EQUAL_DOUBLE(789.0, filter.value());
  27. filter.reset();
  28. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  29. }
  30. void test_max() {
  31. auto filter = MaxFilter();
  32. TEST_ASSERT_EQUAL(1, filter.capacity());
  33. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  34. filter.resize(567);
  35. TEST_ASSERT_EQUAL(1, filter.capacity());
  36. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  37. filter.update(5.0);
  38. TEST_ASSERT_EQUAL_DOUBLE(5.0, filter.value());
  39. filter.update(10.0);
  40. TEST_ASSERT_EQUAL_DOUBLE(10.0, filter.value());
  41. filter.update(15.0);
  42. TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value());
  43. filter.update(10.0);
  44. TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value());
  45. filter.update(-10.0);
  46. TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value());
  47. filter.update(-15.0);
  48. TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value());
  49. filter.update(0.0);
  50. TEST_ASSERT_EQUAL_DOUBLE(15.0, filter.value());
  51. filter.reset();
  52. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  53. }
  54. void test_median() {
  55. auto filter = MedianFilter();
  56. TEST_ASSERT_EQUAL(0, filter.capacity());
  57. const double one[] {4., 3., 5., 6., 2., 2., 3., 4., 7., 9.};
  58. filter.resize(std::size(one));
  59. TEST_ASSERT_EQUAL(std::size(samples), filter.capacity());
  60. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  61. for (const auto& sample : one) {
  62. filter.update(sample);
  63. }
  64. TEST_ASSERT_EQUAL_DOUBLE(4.0, filter.value());
  65. const double two[] {6., 6.1, 6.2, 6.3, 6.4, 6.5, 2.5, 4.5, 2.6, 2.5, 2.4};
  66. filter.resize(std::size(two));
  67. TEST_ASSERT_EQUAL_DOUBLE(9, filter.value());
  68. for (const auto& sample : two) {
  69. filter.update(sample);
  70. }
  71. TEST_ASSERT_EQUAL_DOUBLE(4.97, filter.value());
  72. const double three[] {2.4, 2.4};
  73. filter.resize(std::size(three));
  74. TEST_ASSERT_EQUAL_DOUBLE(2.4, filter.value());
  75. for (const auto& sample : three) {
  76. filter.update(sample);
  77. }
  78. TEST_ASSERT_EQUAL_DOUBLE(2.4, filter.value());
  79. }
  80. void test_moving_average() {
  81. auto filter = MovingAverageFilter();
  82. TEST_ASSERT_EQUAL(0, filter.capacity());
  83. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  84. const double samples[] {22., 22.3, 22.1, 22.1, 22.1, 22.0, 22.5, 22.1};
  85. filter.resize(std::size(samples));
  86. TEST_ASSERT_EQUAL(std::size(samples), filter.capacity());
  87. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  88. for (const auto& sample : samples) {
  89. filter.update(sample);
  90. }
  91. TEST_ASSERT_EQUAL_DOUBLE(22.15, filter.value());
  92. }
  93. void test_sum() {
  94. auto filter = SumFilter();
  95. TEST_ASSERT_EQUAL(1, filter.capacity());
  96. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  97. const double samples[] {20., 20.1, 13., 10., 5., 14., 29., 32.};
  98. filter.resize(std::size(samples));
  99. TEST_ASSERT_EQUAL(1, filter.capacity());
  100. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  101. for (const auto& sample : samples) {
  102. filter.update(sample);
  103. }
  104. TEST_ASSERT_EQUAL_DOUBLE(143.1, filter.value());
  105. filter.reset();
  106. TEST_ASSERT_EQUAL_DOUBLE(0.0, filter.value());
  107. filter.update(-15.0);
  108. filter.update(30.0);
  109. filter.update(-15.0);
  110. filter.update(1.0);
  111. TEST_ASSERT_EQUAL_DOUBLE(1.0, filter.value());
  112. }
  113. } // namespace
  114. } // namespace test
  115. } // namespace espurna
  116. int main(int, char**) {
  117. UNITY_BEGIN();
  118. using namespace espurna::test;
  119. RUN_TEST(test_last);
  120. RUN_TEST(test_max);
  121. RUN_TEST(test_median);
  122. RUN_TEST(test_moving_average);
  123. RUN_TEST(test_sum);
  124. return UNITY_END();
  125. }