From e0c0ebd37dc6ea0d417d23252d52c03d61b7a8bf Mon Sep 17 00:00:00 2001
From: ManifoldFR <wilson.jallet@polytechnique.org>
Date: Tue, 28 Feb 2023 17:25:34 +0100
Subject: [PATCH] Add test user-struct

+ create struct with fixed-size members, expose with setter
---
 unittest/CMakeLists.txt             |  5 +++++
 unittest/python/test_user_struct.py | 17 +++++++++++++++++
 unittest/user_struct.cpp            | 23 +++++++++++++++++++++++
 3 files changed, 45 insertions(+)
 create mode 100644 unittest/python/test_user_struct.py
 create mode 100644 unittest/user_struct.cpp

diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index 667c4192..cccdc44e 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -38,6 +38,7 @@ if(NOT NUMPY_WITH_BROKEN_UFUNC_SUPPORT)
   add_lib_unit_test(user_type)
 endif()
 add_lib_unit_test(std_vector)
+add_lib_unit_test(user_struct)
 
 add_python_unit_test("py-matrix" "unittest/python/test_matrix.py" "unittest")
 
@@ -92,3 +93,7 @@ endif(NOT WIN32)
 add_python_unit_test("py-std-vector" "unittest/python/test_std_vector.py"
                      "python;unittest")
 set_tests_properties("py-std-vector" PROPERTIES DEPENDS ${PYWRAP})
+
+add_python_unit_test("py-user-struct" "unittest/python/test_user_struct.py"
+                     "python;unittest")
+set_tests_properties("py-std-vector" PROPERTIES DEPENDS ${PYWRAP})
diff --git a/unittest/python/test_user_struct.py b/unittest/python/test_user_struct.py
new file mode 100644
index 00000000..bc9f7f94
--- /dev/null
+++ b/unittest/python/test_user_struct.py
@@ -0,0 +1,17 @@
+import numpy as np
+from user_struct import *
+
+
+x = np.ones(3)
+y = np.ones(4)
+ms = MyStruct(x, y)
+print(ms.x)
+print(ms.y)
+
+ms.x[0] = 0.0
+
+ms.x = x  # ok
+assert np.allclose(ms.x, x)
+
+ms.y[:] = y
+ms.y = y  # segfault
diff --git a/unittest/user_struct.cpp b/unittest/user_struct.cpp
new file mode 100644
index 00000000..9b26bc38
--- /dev/null
+++ b/unittest/user_struct.cpp
@@ -0,0 +1,23 @@
+#include "eigenpy/eigenpy.hpp"
+
+struct mystruct {
+  Eigen::Vector3d x_;
+  Eigen::Vector4d y_;
+
+  mystruct(const Eigen::Vector3d& x, const Eigen::Vector4d& y) : x_(x), y_(y) {}
+};
+
+BOOST_PYTHON_MODULE(user_struct) {
+  using namespace Eigen;
+  namespace bp = boost::python;
+  eigenpy::enableEigenPy();
+  bp::class_<mystruct>("MyStruct", bp::init<const Vector3d&, const Vector4d&>())
+      .add_property(
+          "x",
+          bp::make_getter(&mystruct::x_, bp::return_internal_reference<>()),
+          bp::make_setter(&mystruct::x_))
+      .add_property(
+          "y",
+          bp::make_getter(&mystruct::y_, bp::return_internal_reference<>()),
+          bp::make_setter(&mystruct::y_));
+}
-- 
GitLab