Skip to content

Commit d1e1f68

Browse files
authored
Merge pull request stack-of-tasks#2648 from ManifoldFR/topic/visualizers/add-unit-test
unittest/python : add visualizer bindings visitor test, add CMake util to create C++ Python modules for tests
2 parents 0218985 + 51507ac commit d1e1f68

File tree

4 files changed

+109
-2
lines changed

4 files changed

+109
-2
lines changed

include/pinocchio/bindings/python/visualizers/visualizer-visitor.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ namespace pinocchio
2020
{
2121
typedef ::pinocchio::visualizers::BaseVisualizer Base;
2222
typedef ::pinocchio::visualizers::ConstMatrixRef ConstMatrixRef;
23-
static_assert(std::is_base_of_v<Base, Visualizer>);
23+
static_assert(
24+
std::is_base_of<Base, Visualizer>::value,
25+
"Visualizer class must be derived from pinocchio::visualizers::BaseVisualizer.");
2426

2527
static void setCameraPose_proxy(Visualizer & vis, const Base::Matrix4 & pose)
2628
{

unittest/python/CMakeLists.txt

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#
2-
# Copyright (c) 2015-2023 CNRS INRIA
2+
# Copyright (c) 2015-2023 CNRS INRIA, 2024-2025 INRIA
33
#
4+
include(${JRL_CMAKE_MODULES}/python-helpers.cmake)
45

56
set(${PROJECT_NAME}_PYTHON_TESTS
67
bindings
@@ -46,6 +47,55 @@ set(${PROJECT_NAME}_PYTHON_TESTS
4647
bindings_std_vector
4748
bindings_std_map)
4849

50+
function(pinocchio_add_python_cpp_module name)
51+
set(target_name "test-ext-${name}")
52+
string(REPLACE "_" "-" target_name ${target_name})
53+
string(REPLACE "-" "_" module_name ${target_name})
54+
set(source_file "${name}.cpp")
55+
set(options)
56+
set(oneValueArgs)
57+
set(multiValueArgs "PIN_TARGETS")
58+
cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
59+
if(BUILD_TESTING)
60+
set(_exclude)
61+
else()
62+
set(_exclude EXCLUDE_FROM_ALL)
63+
endif()
64+
65+
add_library(${target_name} MODULE ${_exclude} ${source_file})
66+
target_compile_definitions(${target_name} PRIVATE EXT_MODULE_NAME=${module_name})
67+
target_link_libraries(${target_name} PRIVATE pinocchio_default eigenpy::eigenpy)
68+
foreach(_dep ${ARGS_PIN_TARGETS})
69+
target_link_libraries(${target_name} PRIVATE ${_dep})
70+
endforeach()
71+
set_target_properties(
72+
${target_name}
73+
PROPERTIES PREFIX ""
74+
SUFFIX "${PYTHON_EXT_SUFFIX}"
75+
LIBRARY_OUTPUT_NAME ${module_name}
76+
RUNTIME_OUTPUT_NAME ${module_name})
77+
78+
add_test(
79+
NAME ${target_name}
80+
COMMAND ${PYTHON_EXECUTABLE} -c "import ${module_name}"
81+
WORKING_DIRECTORY $<TARGET_FILE_DIR:${target_name}>)
82+
set(PYTHONPATH)
83+
compute_pythonpath(ENV_VARIABLES bindings/python)
84+
set_tests_properties(${target_name} PROPERTIES ENVIRONMENT "${ENV_VARIABLES}")
85+
86+
add_dependencies(build_tests ${target_name})
87+
if(NOT BUILD_TESTING)
88+
set_tests_properties(${target_name} PROPERTIES DEPENDS ctest_build_tests)
89+
endif()
90+
endfunction()
91+
92+
function(pinocchio_add_lib_unit_test name)
93+
set(TEST_NAME "${PROJECT_NAME}-test-py-${name}")
94+
add_python_unit_test(${TEST_NAME} "unittest/python/${name}.py" "bindings/python"
95+
"unittest/python")
96+
add_windows_dll_path_to_test(${TEST_NAME})
97+
endfunction()
98+
4999
if(BUILD_WITH_HPP_FCL_SUPPORT)
50100
set(${PROJECT_NAME}_PYTHON_TESTS ${${PROJECT_NAME}_PYTHON_TESTS} bindings_geometry_object)
51101
set(${PROJECT_NAME}_PYTHON_TESTS ${${PROJECT_NAME}_PYTHON_TESTS} bindings_fcl_transform)
@@ -93,4 +143,10 @@ else()
93143
message(STATUS "Valgrind not found, memory checks are disabled")
94144
endif()
95145

146+
# TODO @jorisv: reenable these on windows when we normalize paths to lib/bin like on eigenpy
147+
if(NOT WIN32)
148+
pinocchio_add_python_cpp_module(bindings_visualizer PIN_TARGETS pinocchio_visualizers)
149+
pinocchio_add_lib_unit_test(bindings_visualizer)
150+
endif()
151+
96152
add_subdirectory(pybind11)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "pinocchio/bindings/python/visualizers/visualizer-visitor.hpp"
2+
3+
namespace bp = boost::python;
4+
namespace pin = pinocchio;
5+
using pin::python::VisualizerPythonVisitor;
6+
using pin::visualizers::BaseVisualizer;
7+
8+
using pin::GeometryModel;
9+
using pin::Model;
10+
11+
struct DummyVisualizer : public BaseVisualizer
12+
{
13+
using BaseVisualizer::BaseVisualizer;
14+
void loadViewerModel() override
15+
{
16+
}
17+
void displayImpl() override
18+
{
19+
}
20+
};
21+
22+
BOOST_PYTHON_MODULE(EXT_MODULE_NAME)
23+
{
24+
bp::import("pinocchio");
25+
26+
bp::class_<DummyVisualizer>("DummyVisualizer", bp::no_init)
27+
.def(bp::init<const Model &, const GeometryModel &>())
28+
.def(VisualizerPythonVisitor<DummyVisualizer>{});
29+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import unittest
2+
3+
import pinocchio as pin
4+
from test_case import PinocchioTestCase as TestCase
5+
from test_ext_bindings_visualizer import DummyVisualizer
6+
7+
8+
class TestBindingsViz(TestCase):
9+
def setUp(self):
10+
self.model = pin.Model()
11+
self.visual = pin.GeometryModel()
12+
self.viz = DummyVisualizer(self.model, self.visual)
13+
14+
def test_getters(self):
15+
self.assertEqual(self.model, self.viz.model)
16+
self.assertEqual(self.visual, self.viz.visualModel)
17+
18+
19+
if __name__ == "__main__":
20+
unittest.main()

0 commit comments

Comments
 (0)