From a963db290066a6a95767d670daf84f78cfdd946d Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Sun, 24 Mar 2024 15:37:11 +0300 Subject: [PATCH] add test (doctest) --- CMakeLists.txt | 20 ++++++++++++++++ common/adc_value_holder.h | 32 +++++++++++++++---------- tests/adc_valueholder_test.cpp | 44 ++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 tests/adc_valueholder_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 862f3ad..f9527ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,26 @@ set(ADC_DEVICE_HEADERS device/adc_device_command.h ) +option(BUILD_TESTS "Buiuld tests" ON) + +if (BUILD_TESTS) + find_package(doctest) + + set(VALUEHOLDER_TEST_APP adc_valueholder_test) + add_executable(${VALUEHOLDER_TEST_APP} tests/adc_valueholder_test.cpp) + + if (NOT doctest_FOUND) + include(FetchContent) + FetchContent_Declare( + doctest + GIT_REPOSITORY https://github.com/doctest/doctest.git + GIT_TAG 2.4.11 + ) + FetchContent_MakeAvailable(doctest) + endif() + + target_link_libraries(${VALUEHOLDER_TEST_APP} PRIVATE doctest::doctest) +endif(BUILD_TESTS) include(GNUInstallDirs) diff --git a/common/adc_value_holder.h b/common/adc_value_holder.h index a834879..6bc1236 100644 --- a/common/adc_value_holder.h +++ b/common/adc_value_holder.h @@ -97,7 +97,8 @@ class AdcValueHolder { protected: template - using arg_t = typename traits::adc_func_traits::ret_t; + // using arg_t = typename traits::adc_func_traits::ret_t; + using arg_t = typename traits::adc_func_traits>::ret_t; std::function _getterWrapper; std::function _setterWrapper; @@ -113,7 +114,7 @@ protected: { using value_t = arg_t; - static_assert(std::is_same_v, "THE getter MUST NOT RETURN void TYPE!!!"); + // static_assert(std::is_same_v, "THE getter MUST NOT RETURN void TYPE!!!"); using g_t = decltype(getter); _getterWrapper = [wrapper = traits::adc_pf_wrapper(std::forward(getter))](std::any& val) { @@ -125,7 +126,7 @@ protected: using vld_t = decltype(validator); using s_t = decltype(setter); - if constexpr (std::is_same_v) { // no validation + if constexpr (std::is_same_v)>) { // no validation _setterWrapper = [wrapper = traits::adc_pf_wrapper(std::forward(setter)), this](const std::any& val) { auto& setter = std::get<0>(wrapper); @@ -160,14 +161,19 @@ public: constexpr static std::tuple _defaultTrivialConvTypes{}; // always-true validator - constexpr static auto AdcValueHolderDummyValidator = [](const auto&) { return true; }; + // constexpr static auto AdcValueHolderDummyValidator = [](const auto&) { return true; }; + template + constexpr static bool AdcValueHolderDummyValidator(const VT&) + { + return true; + }; /* CONSTRUCTORS AND DESTRUCTOR */ - AdcValueHolder( - std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator = AdcValueHolder::AdcValueHolderDummyValidator) + AdcValueHolder(std::invocable<> auto&& getter, + std::invocable&> auto&& setter, + std::predicate&> auto&& validator = + AdcValueHolder::AdcValueHolderDummyValidator>) : _internalTypeIndex(std::type_index(typeid(arg_t))) { init(std::forward(getter), std::forward(setter), @@ -176,11 +182,11 @@ public: template - AdcValueHolder( - std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - const std::tuple& trivialConvTypes, - std::predicate&> auto&& validator = AdcValueHolder::AdcValueHolderDummyValidator) + AdcValueHolder(std::invocable<> auto&& getter, + std::invocable&> auto&& setter, + const std::tuple& trivialConvTypes, + std::predicate&> auto&& validator = + AdcValueHolder::AdcValueHolderDummyValidator>) : AdcValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)) diff --git a/tests/adc_valueholder_test.cpp b/tests/adc_valueholder_test.cpp new file mode 100644 index 0000000..0019bd3 --- /dev/null +++ b/tests/adc_valueholder_test.cpp @@ -0,0 +1,44 @@ +#include +// #include + +#include "../common/adc_value_holder.h" + +// TEST_CASE("[ADC VALUEHOLDER]") +// { +// int ch_i = 10; + +// auto getter = [&ch_i]() { return ch_i; }; +// auto setter = [&ch_i](const int& v) { ch_i = v; }; +// auto validator = [&ch_i](const int& v) { +// if (v < 0) +// return false; +// else +// return true; +// }; + +// adc::AdcValueHolder vh(getter, setter, validator); +// } + + +int main() +{ + int ch_i = 10; + + auto getter = [&ch_i]() { return ch_i; }; + auto setter = [&ch_i](const int& v) { ch_i = v; }; + auto validator = [&ch_i](const int& v) { + if (v < 0) + return false; + else + return true; + }; + + // adc::AdcValueHolder vh(getter, setter, validator); + adc::AdcValueHolder vh(getter, setter, adc::AdcValueHolder::_defaultTrivialConvTypes, validator); + + vh = 77; + + std::cout << "(vh = 77) => ch_i = " << ch_i << "\n"; + + std::cout << (double)vh << "\n"; +}