contact_managers_factory_unit.cpp
Go to the documentation of this file.
1 
28 #include <gtest/gtest.h>
29 #include <fstream>
31 
37 
38 using namespace tesseract_collision;
39 
40 void runContactManagersFactoryTest(const std::filesystem::path& config_path)
41 {
43  ContactManagersPluginFactory factory(config_path, locator);
44  YAML::Node plugin_config =
45  tesseract_common::processYamlIncludeDirective(YAML::LoadFile(config_path.string()), locator);
46 
47  const YAML::Node& plugin_info = plugin_config["contact_manager_plugins"];
48  const YAML::Node& search_paths = plugin_info["search_paths"];
49  const YAML::Node& search_libraries = plugin_info["search_libraries"];
50  const YAML::Node& discrete_plugins = plugin_info["discrete_plugins"]["plugins"];
51  const YAML::Node& continuous_plugins = plugin_info["continuous_plugins"]["plugins"];
52 
53  {
54  std::set<std::string> sp = factory.getSearchPaths();
55  EXPECT_EQ(sp.size(), 2);
56 
57  for (auto it = search_paths.begin(); it != search_paths.end(); ++it)
58  {
59  EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
60  }
61  }
62 
63  {
64  std::set<std::string> sl = factory.getSearchLibraries();
65  EXPECT_EQ(sl.size(), 2);
66 
67  for (auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
68  {
69  EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
70  }
71  }
72 
73  EXPECT_EQ(discrete_plugins.size(), 3);
74  for (auto cm_it = discrete_plugins.begin(); cm_it != discrete_plugins.end(); ++cm_it)
75  {
76  auto name = cm_it->first.as<std::string>();
77 
79  EXPECT_TRUE(cm != nullptr);
80  }
81 
82  EXPECT_EQ(continuous_plugins.size(), 2);
83  for (auto cm_it = continuous_plugins.begin(); cm_it != continuous_plugins.end(); ++cm_it)
84  {
85  auto name = cm_it->first.as<std::string>();
86 
88  EXPECT_TRUE(cm != nullptr);
89  }
90 
91  factory.saveConfig(std::filesystem::path(tesseract_common::getTempPath()) / "contact_manager_plugins_export."
92  "yaml");
93 
94  // Failures
95  {
97  EXPECT_TRUE(cm == nullptr);
98  }
99  {
101  EXPECT_TRUE(cm == nullptr);
102  }
103  {
104  tesseract_common::PluginInfo plugin_info;
105  plugin_info.class_name = "DoesNotExistFactory";
106  DiscreteContactManager::UPtr cm = factory.createDiscreteContactManager("DoesNotExist", plugin_info);
107  EXPECT_TRUE(cm == nullptr);
108  }
109  {
110  tesseract_common::PluginInfo plugin_info;
111  plugin_info.class_name = "DoesNotExistFactory";
112  ContinuousContactManager::UPtr cm = factory.createContinuousContactManager("DoesNotExist", plugin_info);
113  EXPECT_TRUE(cm == nullptr);
114  }
115 }
116 
117 TEST(TesseractContactManagersFactoryUnit, LoadAndExportPluginTest) // NOLINT
118 {
119  std::filesystem::path file_path(__FILE__);
120  std::filesystem::path config_path = file_path.parent_path() / "contact_manager_plugins.yaml";
121  runContactManagersFactoryTest(config_path);
122 
123  std::filesystem::path export_config_path = std::filesystem::path(tesseract_common::getTempPath()) / "contac"
124  "t_"
125  "manage"
126  "r_"
127  "plugin"
128  "s_"
129  "export"
130  ".yaml";
131  runContactManagersFactoryTest(export_config_path);
132 }
133 
134 TEST(TesseractContactManagersFactoryUnit, LoadStringPluginTest) // NOLINT
135 {
136  std::string config = R"(contact_manager_plugins:
137  search_paths:
138  - /usr/local/lib
139  search_libraries:
140  - tesseract_collision_bullet_factories
141  - tesseract_collision_fcl_factories
142  discrete_plugins:
143  default: BulletDiscreteBVHManager
144  plugins:
145  BulletDiscreteBVHManager:
146  class: BulletDiscreteBVHManagerFactory
147  BulletDiscreteSimpleManager:
148  class: BulletDiscreteSimpleManagerFactory
149  FCLDiscreteBVHManager:
150  class: FCLDiscreteBVHManagerFactory
151  continuous_plugins:
152  default: BulletCastBVHManager
153  plugins:
154  BulletCastBVHManager:
155  class: BulletCastBVHManagerFactory
156  BulletCastSimpleManager:
157  class: BulletCastSimpleManagerFactory)";
158 
160  ContactManagersPluginFactory factory(config, locator);
161  YAML::Node plugin_config = tesseract_common::loadYamlString(config, locator);
162 
163  const YAML::Node& plugin_info = plugin_config["contact_manager_plugins"];
164  const YAML::Node& search_paths = plugin_info["search_paths"];
165  const YAML::Node& search_libraries = plugin_info["search_libraries"];
166  const YAML::Node& discrete_plugins = plugin_info["discrete_plugins"]["plugins"];
167  const YAML::Node& continuous_plugins = plugin_info["continuous_plugins"]["plugins"];
168 
169  {
170  std::set<std::string> sp = factory.getSearchPaths();
171  EXPECT_EQ(sp.size(), 2);
172 
173  for (auto it = search_paths.begin(); it != search_paths.end(); ++it)
174  {
175  EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
176  }
177  }
178 
179  {
180  std::set<std::string> sl = factory.getSearchLibraries();
181  EXPECT_EQ(sl.size(), 2);
182 
183  for (auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
184  {
185  EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
186  }
187  }
188 
189  EXPECT_EQ(discrete_plugins.size(), 3);
190  for (auto cm_it = discrete_plugins.begin(); cm_it != discrete_plugins.end(); ++cm_it)
191  {
192  auto name = cm_it->first.as<std::string>();
193 
195  EXPECT_TRUE(cm != nullptr);
196  }
197 
198  EXPECT_EQ(continuous_plugins.size(), 2);
199  for (auto cm_it = continuous_plugins.begin(); cm_it != continuous_plugins.end(); ++cm_it)
200  {
201  auto name = cm_it->first.as<std::string>();
202 
204  EXPECT_TRUE(cm != nullptr);
205  }
206 }
207 
208 TEST(TesseractContactManagersFactoryUnit, PluginFactorAPIUnit) // NOLINT
209 {
211  EXPECT_FALSE(factory.getSearchPaths().empty());
212  EXPECT_EQ(factory.getSearchPaths().size(), 1);
213  EXPECT_FALSE(factory.getSearchLibraries().empty());
214  EXPECT_EQ(factory.getSearchLibraries().size(), 2);
215  EXPECT_EQ(factory.getDiscreteContactManagerPlugins().size(), 0);
216  EXPECT_EQ(factory.getContinuousContactManagerPlugins().size(), 0);
217  EXPECT_ANY_THROW(factory.getDefaultDiscreteContactManagerPlugin()); // NOLINT
218  EXPECT_ANY_THROW(factory.getDefaultContinuousContactManagerPlugin()); // NOLINT
221 
222  factory.addSearchPath("/usr/local/lib");
223  EXPECT_EQ(factory.getSearchPaths().size(), 2);
224  EXPECT_EQ(factory.getSearchLibraries().size(), 2);
225 
226  factory.addSearchLibrary("tesseract_collision");
227  EXPECT_EQ(factory.getSearchPaths().size(), 2);
228  EXPECT_EQ(factory.getSearchLibraries().size(), 3);
229 
230  {
232  EXPECT_TRUE(map.find("NotFound") == map.end());
233 
235  pi.class_name = "TestDiscreteManagerFactory";
236  factory.addDiscreteContactManagerPlugin("TestDiscreteManager", pi);
237  EXPECT_EQ(factory.getDiscreteContactManagerPlugins().size(), 1);
239 
240  map = factory.getDiscreteContactManagerPlugins();
241  EXPECT_TRUE(map.find("TestDiscreteManager") != map.end());
242  EXPECT_EQ(factory.getDefaultDiscreteContactManagerPlugin(), "TestDiscreteManager");
243 
245  pi2.class_name = "Test2DiscreteManagerFactory";
246  factory.addDiscreteContactManagerPlugin("Test2DiscreteManager", pi2);
247  EXPECT_EQ(factory.getDiscreteContactManagerPlugins().size(), 2);
249 
250  map = factory.getDiscreteContactManagerPlugins();
251  EXPECT_TRUE(map.find("Test2DiscreteManager") != map.end());
252  EXPECT_EQ(factory.getDefaultDiscreteContactManagerPlugin(), "Test2DiscreteManager");
253  factory.setDefaultDiscreteContactManagerPlugin("TestDiscreteManager");
254  EXPECT_EQ(factory.getDefaultDiscreteContactManagerPlugin(), "TestDiscreteManager");
255 
256  factory.removeDiscreteContactManagerPlugin("TestDiscreteManager");
257  map = factory.getDiscreteContactManagerPlugins();
258  EXPECT_TRUE(map.find("Test2DiscreteManager") != map.end());
259  EXPECT_EQ(factory.getDiscreteContactManagerPlugins().size(), 1);
260  // The default was removed so it should now be the first solver
261  EXPECT_EQ(factory.getDefaultDiscreteContactManagerPlugin(), "Test2DiscreteManager");
262 
263  // Failures
264  EXPECT_ANY_THROW(factory.removeDiscreteContactManagerPlugin("DoesNotExist")); // NOLINT
265  EXPECT_ANY_THROW(factory.setDefaultDiscreteContactManagerPlugin("DoesNotExist")); // NOLINT
266  }
267 
268  {
270  EXPECT_TRUE(map.find("NotFound") == map.end());
271 
273  pi.class_name = "TestContinuousManagerFactory";
274  factory.addContinuousContactManagerPlugin("TestContinuousManager", pi);
275  EXPECT_EQ(factory.getContinuousContactManagerPlugins().size(), 1);
277 
278  map = factory.getContinuousContactManagerPlugins();
279  EXPECT_TRUE(map.find("TestContinuousManager") != map.end());
280  EXPECT_EQ(factory.getDefaultContinuousContactManagerPlugin(), "TestContinuousManager");
281 
283  pi2.class_name = "Test2ContinuousManagerFactory";
284  factory.addContinuousContactManagerPlugin("Test2ContinuousManager", pi2);
285  EXPECT_EQ(factory.getContinuousContactManagerPlugins().size(), 2);
287 
288  map = factory.getContinuousContactManagerPlugins();
289  EXPECT_TRUE(map.find("Test2ContinuousManager") != map.end());
290  EXPECT_EQ(factory.getDefaultContinuousContactManagerPlugin(), "Test2ContinuousManager");
291  factory.setDefaultContinuousContactManagerPlugin("TestContinuousManager");
292  EXPECT_EQ(factory.getDefaultContinuousContactManagerPlugin(), "TestContinuousManager");
293 
294  factory.removeContinuousContactManagerPlugin("TestContinuousManager");
295 
296  map = factory.getContinuousContactManagerPlugins();
297  EXPECT_TRUE(map.find("Test2ContinuousManager") != map.end());
298  EXPECT_EQ(factory.getContinuousContactManagerPlugins().size(), 1);
299  // The default was removed so it should now be the first solver
300  EXPECT_EQ(factory.getDefaultContinuousContactManagerPlugin(), "Test2ContinuousManager");
301 
302  // Failures
303  EXPECT_ANY_THROW(factory.removeContinuousContactManagerPlugin("DoesNotExist")); // NOLINT
304  EXPECT_ANY_THROW(factory.setDefaultContinuousContactManagerPlugin("DoesNotExist")); // NOLINT
305  }
306 }
307 
308 TEST(TesseractContactManagersFactoryUnit, LoadOnlyDiscretePluginTest) // NOLINT
309 {
310  std::string config = R"(contact_manager_plugins:
311  search_paths:
312  - /usr/local/lib
313  search_libraries:
314  - tesseract_collision_bullet_factories
315  - tesseract_collision_fcl_factories
316  discrete_plugins:
317  default: BulletDiscreteBVHManager
318  plugins:
319  BulletDiscreteBVHManager:
320  class: BulletDiscreteBVHManagerFactory
321  BulletDiscreteSimpleManager:
322  class: BulletDiscreteSimpleManagerFactory
323  FCLDiscreteBVHManager:
324  class: FCLDiscreteBVHManagerFactory)";
325 
327  ContactManagersPluginFactory factory(config, locator);
328  YAML::Node plugin_config = tesseract_common::loadYamlString(config, locator);
329 
330  const YAML::Node& plugin_info = plugin_config["contact_manager_plugins"];
331  const YAML::Node& search_paths = plugin_info["search_paths"];
332  const YAML::Node& search_libraries = plugin_info["search_libraries"];
333  const YAML::Node& discrete_plugins = plugin_info["discrete_plugins"]["plugins"];
334 
335  {
336  std::set<std::string> sp = factory.getSearchPaths();
337  EXPECT_EQ(sp.size(), 2);
338 
339  for (auto it = search_paths.begin(); it != search_paths.end(); ++it)
340  {
341  EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
342  }
343  }
344 
345  {
346  std::set<std::string> sl = factory.getSearchLibraries();
347  EXPECT_EQ(sl.size(), 2);
348 
349  for (auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
350  {
351  EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
352  }
353  }
354 
355  EXPECT_EQ(discrete_plugins.size(), 3);
356  for (auto cm_it = discrete_plugins.begin(); cm_it != discrete_plugins.end(); ++cm_it)
357  {
358  auto name = cm_it->first.as<std::string>();
359 
361  EXPECT_TRUE(cm != nullptr);
362  }
363 }
364 
365 TEST(TesseractContactManagersFactoryUnit, LoadOnlyContinuousPluginTest) // NOLINT
366 {
367  std::string config = R"(contact_manager_plugins:
368  search_paths:
369  - /usr/local/lib
370  search_libraries:
371  - tesseract_collision_bullet_factories
372  - tesseract_collision_fcl_factories
373  continuous_plugins:
374  default: BulletCastBVHManager
375  plugins:
376  BulletCastBVHManager:
377  class: BulletCastBVHManagerFactory
378  BulletCastSimpleManager:
379  class: BulletCastSimpleManagerFactory)";
380 
382  ContactManagersPluginFactory factory(config, locator);
383  YAML::Node plugin_config = tesseract_common::loadYamlString(config, locator);
384 
385  const YAML::Node& plugin_info = plugin_config["contact_manager_plugins"];
386  const YAML::Node& search_paths = plugin_info["search_paths"];
387  const YAML::Node& search_libraries = plugin_info["search_libraries"];
388  const YAML::Node& continuous_plugins = plugin_info["continuous_plugins"]["plugins"];
389 
390  {
391  std::set<std::string> sp = factory.getSearchPaths();
392  EXPECT_EQ(sp.size(), 2);
393 
394  for (auto it = search_paths.begin(); it != search_paths.end(); ++it)
395  {
396  EXPECT_TRUE(sp.find(it->as<std::string>()) != sp.end());
397  }
398  }
399 
400  {
401  std::set<std::string> sl = factory.getSearchLibraries();
402  EXPECT_EQ(sl.size(), 2);
403 
404  for (auto it = search_libraries.begin(); it != search_libraries.end(); ++it)
405  {
406  EXPECT_TRUE(sl.find(it->as<std::string>()) != sl.end());
407  }
408  }
409 
410  EXPECT_EQ(continuous_plugins.size(), 2);
411  for (auto cm_it = continuous_plugins.begin(); cm_it != continuous_plugins.end(); ++cm_it)
412  {
413  auto name = cm_it->first.as<std::string>();
414 
416  EXPECT_TRUE(cm != nullptr);
417  }
418 }
419 
420 int main(int argc, char** argv)
421 {
422  testing::InitGoogleTest(&argc, argv);
423 
424  return RUN_ALL_TESTS();
425 }
contact_managers_plugin_factory.h
Factory for loading contact managers as plugins.
tesseract_collision::ContactManagersPluginFactory::createDiscreteContactManager
std::unique_ptr< DiscreteContactManager > createDiscreteContactManager(const std::string &name) const
Get discrete contact manager object given name.
Definition: contact_managers_plugin_factory.cpp:224
tesseract_common::processYamlIncludeDirective
YAML::Node processYamlIncludeDirective(const YAML::Node &node, const ResourceLocator &locator)
tesseract_collision::ContactManagersPluginFactory::hasContinuousContactManagerPlugins
bool hasContinuousContactManagerPlugins() const
Check if it has continuous contact manager plugins.
Definition: contact_managers_plugin_factory.cpp:178
tesseract_collision::ContinuousContactManager::UPtr
std::unique_ptr< ContinuousContactManager > UPtr
Definition: continuous_contact_manager.h:48
tesseract_common::getTempPath
std::string getTempPath()
tesseract_collision::ContactManagersPluginFactory::saveConfig
void saveConfig(const std::filesystem::path &file_path) const
Save the plugin information to a yaml config file.
Definition: contact_managers_plugin_factory.cpp:309
resource_locator.h
tesseract_collision::ContactManagersPluginFactory::addSearchLibrary
void addSearchLibrary(const std::string &library_name)
Add a library to search for plugin name.
Definition: contact_managers_plugin_factory.cpp:109
tesseract_collision::ContactManagersPluginFactory::removeContinuousContactManagerPlugin
void removeContinuousContactManagerPlugin(const std::string &name)
Remove continuous contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:188
main
int main(int argc, char **argv)
Definition: contact_managers_factory_unit.cpp:420
tesseract_collision::ContactManagersPluginFactory::createContinuousContactManager
std::unique_ptr< ContinuousContactManager > createContinuousContactManager(const std::string &name) const
Get continuous contact manager object given name.
Definition: contact_managers_plugin_factory.cpp:267
discrete_contact_manager.h
This is the discrete contact manager base class.
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_collision::ContactManagersPluginFactory::getDefaultDiscreteContactManagerPlugin
std::string getDefaultDiscreteContactManagerPlugin() const
Get the default discrete contact manager.
Definition: contact_managers_plugin_factory.cpp:160
EXPECT_TRUE
#define EXPECT_TRUE(args)
tesseract_collision::ContactManagersPluginFactory::addSearchPath
void addSearchPath(const std::string &path)
Add location for the plugin loader to search.
Definition: contact_managers_plugin_factory.cpp:103
tesseract_common::PluginInfo::class_name
std::string class_name
TEST
TEST(TesseractContactManagersFactoryUnit, LoadAndExportPluginTest)
Definition: contact_managers_factory_unit.cpp:117
name
std::string name
tesseract_collision::ContactManagersPluginFactory::getSearchLibraries
std::set< std::string > getSearchLibraries() const
Get the plugin search libraries.
Definition: contact_managers_plugin_factory.cpp:114
tesseract_collision::ContactManagersPluginFactory::setDefaultDiscreteContactManagerPlugin
void setDefaultDiscreteContactManagerPlugin(const std::string &name)
Set a default discrete contact manager.
Definition: contact_managers_plugin_factory.cpp:150
tesseract_common::PluginInfo
tesseract_collision::ContactManagersPluginFactory::getContinuousContactManagerPlugins
tesseract_common::PluginInfoMap getContinuousContactManagerPlugins() const
Get the map of continuous contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:183
tesseract_common::loadYamlString
YAML::Node loadYamlString(const std::string &yaml_string, const ResourceLocator &locator)
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
tesseract_collision::ContactManagersPluginFactory::hasDiscreteContactManagerPlugins
bool hasDiscreteContactManagerPlugins() const
Check if it has discrete contact manager plugins.
Definition: contact_managers_plugin_factory.cpp:127
tesseract_common::PluginInfoMap
std::map< std::string, PluginInfo > PluginInfoMap
tesseract_collision::ContactManagersPluginFactory::addContinuousContactManagerPlugin
void addContinuousContactManagerPlugin(const std::string &name, tesseract_common::PluginInfo plugin_info)
Add a continuous contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:172
tesseract_collision::ContactManagersPluginFactory
Definition: contact_managers_plugin_factory.h:100
runContactManagersFactoryTest
void runContactManagersFactoryTest(const std::filesystem::path &config_path)
Definition: contact_managers_factory_unit.cpp:40
yaml_utils.h
tesseract_collision::ContactManagersPluginFactory::getDiscreteContactManagerPlugins
tesseract_common::PluginInfoMap getDiscreteContactManagerPlugins() const
Get the map of discrete contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:132
tesseract_collision::ContactManagersPluginFactory::addDiscreteContactManagerPlugin
void addDiscreteContactManagerPlugin(const std::string &name, tesseract_common::PluginInfo plugin_info)
Add a discrete contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:121
tesseract_common::GeneralResourceLocator
tesseract_collision::DiscreteContactManager::UPtr
std::unique_ptr< DiscreteContactManager > UPtr
Definition: discrete_contact_manager.h:50
tesseract_collision
Definition: bullet_cast_bvh_manager.h:48
tesseract_collision::ContactManagersPluginFactory::getDefaultContinuousContactManagerPlugin
std::string getDefaultContinuousContactManagerPlugin() const
Get the default continuous contact manager.
Definition: contact_managers_plugin_factory.cpp:211
macros.h
tesseract_collision::ContactManagersPluginFactory::getSearchPaths
std::set< std::string > getSearchPaths() const
Get the plugin search paths.
Definition: contact_managers_plugin_factory.cpp:105
tesseract_collision::ContactManagersPluginFactory::setDefaultContinuousContactManagerPlugin
void setDefaultContinuousContactManagerPlugin(const std::string &name)
Set a default continuous contact manager.
Definition: contact_managers_plugin_factory.cpp:201
EXPECT_EQ
#define EXPECT_EQ(a, b)
EXPECT_FALSE
#define EXPECT_FALSE(args)
continuous_contact_manager.h
This is the continuous contact manager base class.
tesseract_collision::ContactManagersPluginFactory::removeDiscreteContactManagerPlugin
void removeDiscreteContactManagerPlugin(const std::string &name)
Remove discrete contact manager plugin.
Definition: contact_managers_plugin_factory.cpp:137


tesseract_collision
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:52