From cf2107f67852e765cdb705cd4440363311fa58b1 Mon Sep 17 00:00:00 2001 From: oscarmartinez Date: Thu, 17 Jul 2025 11:07:26 +0200 Subject: [PATCH 1/2] Added chain length getter with tests --- include/filters/filter_chain.hpp | 17 ++++++ test/test_chain.cpp | 94 ++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/include/filters/filter_chain.hpp b/include/filters/filter_chain.hpp index b75d095..dc502af 100644 --- a/include/filters/filter_chain.hpp +++ b/include/filters/filter_chain.hpp @@ -31,6 +31,7 @@ #define FILTERS__FILTER_CHAIN_HPP_ #include +#include #include #include #include @@ -294,6 +295,14 @@ class FilterChain return true; } + /** + * \brief Get the length of the chain (number of configured filters) + */ + size_t get_length() + { + return reference_pointers_.size(); + } + rcl_interfaces::msg::SetParametersResult reconfigureCB(std::vector parameters) { auto result = rcl_interfaces::msg::SetParametersResult(); @@ -470,6 +479,14 @@ class MultiChannelFilterChain return true; } + /** + * \brief Get the length of the chain (number of configured filters) + */ + size_t get_length() + { + return reference_pointers_.size(); + } + rcl_interfaces::msg::SetParametersResult reconfigureCB(std::vector parameters) { auto result = rcl_interfaces::msg::SetParametersResult(); diff --git a/test/test_chain.cpp b/test/test_chain.cpp index a439fdd..409b338 100644 --- a/test/test_chain.cpp +++ b/test/test_chain.cpp @@ -438,3 +438,97 @@ TEST_F(ChainTest, TenMultiChannelIncrementChains) { EXPECT_EQ(11, v1a[i]); } } + +TEST_F(ChainTest, TestChainLength) { + filters::FilterChain chain("int"); + + std::vector overrides; + overrides.emplace_back("OneIncrements.filter1.name", std::string("increment1")); + overrides.emplace_back("OneIncrements.filter1.type", std::string("filters/IncrementFilterInt")); + + overrides.emplace_back("TwoIncrements.filter1.name", std::string("increment1")); + overrides.emplace_back("TwoIncrements.filter1.type", std::string("filters/IncrementFilterInt")); + overrides.emplace_back("TwoIncrements.filter2.name", std::string("increment2")); + overrides.emplace_back("TwoIncrements.filter2.type", std::string("filters/IncrementFilterInt")); + + overrides.emplace_back("FiveIncrements.filter1.name", std::string("increment1")); + overrides.emplace_back("FiveIncrements.filter1.type", std::string("filters/IncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter2.name", std::string("increment2")); + overrides.emplace_back("FiveIncrements.filter2.type", std::string("filters/IncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter3.name", std::string("increment3")); + overrides.emplace_back("FiveIncrements.filter3.type", std::string("filters/IncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter4.name", std::string("increment4")); + overrides.emplace_back("FiveIncrements.filter4.type", std::string("filters/IncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter5.name", std::string("increment5")); + overrides.emplace_back("FiveIncrements.filter5.type", std::string("filters/IncrementFilterInt")); + auto node = make_node_with_params(overrides); + + ASSERT_TRUE( + chain.configure( + "ZeroFilters", node->get_node_logging_interface(), node->get_node_parameters_interface())); + EXPECT_EQ(chain.get_length(), 0); + chain.clear(); + + ASSERT_TRUE( + chain.configure( + "TwoIncrements", node->get_node_logging_interface(), node->get_node_parameters_interface())); + EXPECT_EQ(chain.get_length(), 2); + chain.clear(); + + ASSERT_TRUE( + chain.configure( + "FiveIncrements", node->get_node_logging_interface(), node->get_node_parameters_interface())); + EXPECT_EQ(chain.get_length(), 5); +} + +TEST_F(ChainTest, TestMultiChannelChainLength) { + filters::MultiChannelFilterChain chain("int"); + + std::vector overrides; + overrides.emplace_back("OneIncrements.filter1.name", std::string("increment1")); + overrides.emplace_back( + "OneIncrements.filter1.type", std::string("filters/MultiChannelIncrementFilterInt")); + + overrides.emplace_back("TwoIncrements.filter1.name", std::string("increment1")); + overrides.emplace_back( + "TwoIncrements.filter1.type", std::string("filters/MultiChannelIncrementFilterInt")); + overrides.emplace_back("TwoIncrements.filter2.name", std::string("increment2")); + overrides.emplace_back( + "TwoIncrements.filter2.type", std::string("filters/MultiChannelIncrementFilterInt")); + + overrides.emplace_back("FiveIncrements.filter1.name", std::string("increment1")); + overrides.emplace_back( + "FiveIncrements.filter1.type", std::string("filters/MultiChannelIncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter2.name", std::string("increment2")); + overrides.emplace_back( + "FiveIncrements.filter2.type", std::string("filters/MultiChannelIncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter3.name", std::string("increment3")); + overrides.emplace_back( + "FiveIncrements.filter3.type", std::string("filters/MultiChannelIncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter4.name", std::string("increment4")); + overrides.emplace_back( + "FiveIncrements.filter4.type", std::string("filters/MultiChannelIncrementFilterInt")); + overrides.emplace_back("FiveIncrements.filter5.name", std::string("increment5")); + overrides.emplace_back( + "FiveIncrements.filter5.type", std::string("filters/MultiChannelIncrementFilterInt")); + auto node = make_node_with_params(overrides); + + ASSERT_TRUE( + chain.configure( + 3, "ZeroFilters", node->get_node_logging_interface(), node->get_node_parameters_interface())); + EXPECT_EQ(chain.get_length(), 0); + chain.clear(); + + ASSERT_TRUE( + chain.configure( + 3, "TwoIncrements", node->get_node_logging_interface(), + node->get_node_parameters_interface())); + EXPECT_EQ(chain.get_length(), 2); + chain.clear(); + + ASSERT_TRUE( + chain.configure( + 3, "FiveIncrements", node->get_node_logging_interface(), + node->get_node_parameters_interface())); + EXPECT_EQ(chain.get_length(), 5); +} From 67890abe03c99692242dbd51aac6efc05b9e5cca Mon Sep 17 00:00:00 2001 From: oscarmartinez Date: Thu, 17 Jul 2025 11:29:43 +0200 Subject: [PATCH 2/2] Added throw on unconfigured update call --- include/filters/filter_chain.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/filters/filter_chain.hpp b/include/filters/filter_chain.hpp index dc502af..4269b46 100644 --- a/include/filters/filter_chain.hpp +++ b/include/filters/filter_chain.hpp @@ -191,6 +191,9 @@ class FilterChain */ bool update(const T & data_in, T & data_out) { + if (!configured_) { + throw std::runtime_error("The update cannot be called without configuring the filter chain!"); + } bool result; size_t list_size = reference_pointers_.size(); if (list_size == 0) { @@ -361,6 +364,9 @@ class MultiChannelFilterChain */ bool update(const std::vector & data_in, std::vector & data_out) { + if (!configured_) { + throw std::runtime_error("The update cannot be called without configuring the filter chain!"); + } bool result; size_t list_size = reference_pointers_.size();