From bfb0c32202153d90f736884564a133180cdc248e Mon Sep 17 00:00:00 2001
From: Joris Vaillant <joris.vaillant@inria.fr>
Date: Tue, 30 Jan 2024 15:16:28 +0100
Subject: [PATCH] unittest: Refactor test to test on std::variant and
 boost::variant

---
 unittest/CMakeLists.txt                       | 28 +++++++++----------
 unittest/bind_optional.cpp.in                 |  6 ++--
 ...ptional.py.in => test_bind_optional.py.in} |  0
 ...st_boost_variant.py => test_variant.py.in} |  8 +++++-
 .../{boost_variant.cpp => variant.cpp.in}     |  7 +++--
 5 files changed, 30 insertions(+), 19 deletions(-)
 rename unittest/python/{test_optional.py.in => test_bind_optional.py.in} (100%)
 rename unittest/python/{test_boost_variant.py => test_variant.py.in} (80%)
 rename unittest/{boost_variant.cpp => variant.cpp.in} (87%)

diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index c65c6cf1..6c2165fe 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -45,24 +45,28 @@ add_lib_unit_test(std_vector)
 add_lib_unit_test(std_array)
 add_lib_unit_test(std_pair)
 add_lib_unit_test(user_struct)
-add_lib_unit_test(boost_variant)
 
-function(config_bind_optional tagname opttype)
-  set(MODNAME bind_optional_${tagname})
-  set(OPTIONAL ${opttype})
-  configure_file(bind_optional.cpp.in ${MODNAME}.cpp)
+function(config_test test tagname opttype)
+  set(MODNAME ${test}_${tagname})
+  set(TEST_TYPE ${opttype})
+  configure_file(${test}.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${MODNAME}.cpp)
 
-  set(py_file test_optional_${tagname}.py)
-  configure_file(python/test_optional.py.in
+  set(py_file test_${test}_${tagname}.py)
+  configure_file(python/test_${test}.py.in
                  ${CMAKE_CURRENT_BINARY_DIR}/python/${py_file})
   add_lib_unit_test(${MODNAME})
-  add_python_unit_test("py-optional-${tagname}" "unittest/python/${py_file}"
+  add_python_unit_test("py-${test}-${tagname}" "unittest/python/${py_file}"
                        "unittest")
 endfunction()
 
-config_bind_optional(boost "boost::optional")
+config_test(variant boost "boost::variant")
 if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98)
-  config_bind_optional(std "std::optional")
+  config_test(variant std "std::variant")
+endif()
+
+config_test(bind_optional boost "boost::optional")
+if(CMAKE_CXX_STANDARD GREATER 14 AND CMAKE_CXX_STANDARD LESS 98)
+  config_test(bind_optional std "std::optional")
 endif()
 
 add_lib_unit_test(bind_virtual_factory)
@@ -133,10 +137,6 @@ add_python_unit_test("py-user-struct" "unittest/python/test_user_struct.py"
                      "python;unittest")
 set_tests_properties("py-user-struct" PROPERTIES DEPENDS ${PYWRAP})
 
-add_python_unit_test("py-boost-variant" "unittest/python/test_boost_variant.py"
-                     "python;unittest")
-set_tests_properties("py-boost-variant" PROPERTIES DEPENDS ${PYWRAP})
-
 add_python_unit_test("py-bind-virtual" "unittest/python/test_bind_virtual.py"
                      "python;unittest")
 set_tests_properties("py-bind-virtual" PROPERTIES DEPENDS ${PYWRAP})
diff --git a/unittest/bind_optional.cpp.in b/unittest/bind_optional.cpp.in
index 844449b1..30b9ac24 100644
--- a/unittest/bind_optional.cpp.in
+++ b/unittest/bind_optional.cpp.in
@@ -8,7 +8,8 @@
 #include <optional>
 #endif
 
-#cmakedefine OPTIONAL @OPTIONAL@
+#cmakedefine TEST_TYPE @TEST_TYPE@
+#define OPTIONAL TEST_TYPE
 
 typedef eigenpy::detail::nullopt_helper<OPTIONAL> none_helper;
 static auto OPT_NONE = none_helper::value();
@@ -74,6 +75,7 @@ BOOST_PYTHON_MODULE(@MODNAME@) {
           bp::make_setter(&mystruct::msg));
 
   bp::def("none_if_zero", none_if_zero, bp::args("i"));
-  bp::def("create_if_true", create_if_true, (bp::arg("flag"), bp::arg("b") = OPT_NONE));
+  bp::def("create_if_true", create_if_true,
+          (bp::arg("flag"), bp::arg("b") = OPT_NONE));
   bp::def("random_mat_if_true", random_mat_if_true, bp::args("flag"));
 }
diff --git a/unittest/python/test_optional.py.in b/unittest/python/test_bind_optional.py.in
similarity index 100%
rename from unittest/python/test_optional.py.in
rename to unittest/python/test_bind_optional.py.in
diff --git a/unittest/python/test_boost_variant.py b/unittest/python/test_variant.py.in
similarity index 80%
rename from unittest/python/test_boost_variant.py
rename to unittest/python/test_variant.py.in
index 023b940b..df375b1b 100644
--- a/unittest/python/test_boost_variant.py
+++ b/unittest/python/test_variant.py.in
@@ -1,4 +1,10 @@
-from boost_variant import V1, V2, VariantHolder, make_variant
+import importlib
+
+variant_module = importlib.import_module("@MODNAME@")
+V1 = variant_module.V1
+V2 = variant_module.V2
+VariantHolder = variant_module.VariantHolder
+make_variant = variant_module.make_variant
 
 variant = make_variant()
 assert isinstance(variant, V1)
diff --git a/unittest/boost_variant.cpp b/unittest/variant.cpp.in
similarity index 87%
rename from unittest/boost_variant.cpp
rename to unittest/variant.cpp.in
index fad8e458..ee339cc3 100644
--- a/unittest/boost_variant.cpp
+++ b/unittest/variant.cpp.in
@@ -4,6 +4,9 @@
 #include <eigenpy/eigenpy.hpp>
 #include <eigenpy/variant.hpp>
 
+#cmakedefine TEST_TYPE @TEST_TYPE@
+#define VARIANT TEST_TYPE
+
 namespace bp = boost::python;
 
 struct V1 {
@@ -12,7 +15,7 @@ struct V1 {
 struct V2 {
   char v;
 };
-typedef boost::variant<V1, V2> MyVariant;
+typedef VARIANT<V1, V2> MyVariant;
 
 MyVariant make_variant() { return V1(); }
 
@@ -20,7 +23,7 @@ struct VariantHolder {
   MyVariant variant;
 };
 
-BOOST_PYTHON_MODULE(boost_variant) {
+BOOST_PYTHON_MODULE(@MODNAME@) {
   using namespace eigenpy;
 
   enableEigenPy();
-- 
GitLab