@@ -38,6 +38,8 @@ using sofa::scenechecking::SceneCheckMissingRequiredPlugin;
3838using sofa::scenechecking::SceneCheckDuplicatedName;
3939#include < SceneChecking/SceneCheckUsingAlias.h>
4040using sofa::scenechecking::SceneCheckUsingAlias;
41+ #include < SceneChecking/SceneCheckCollisionPipelineAndModels.h>
42+ using sofa::scenechecking::SceneCheckCollisionPipelineAndModels;
4143
4244#include < sofa/helper/system/PluginManager.h>
4345using sofa::helper::system::PluginManager;
@@ -238,6 +240,74 @@ struct SceneChecker_test : public BaseSimulationTest
238240 checker.validate (root.get (), &sceneLoader);
239241 }
240242 }
243+
244+ void checkCollisionPipelineModels (bool withPipeline, bool withCollisionModel)
245+ {
246+ std::string scenePrefix = R"( "
247+ <Node name='root'>
248+ <DefaultAnimationLoop/>
249+ <RequiredPlugin name='Sofa.Component.Collision.Detection.Algorithm' />
250+ <RequiredPlugin name='Sofa.Component.Collision.Detection.Intersection' />
251+ <RequiredPlugin name='Sofa.Component.Collision.Geometry' />
252+ <RequiredPlugin name='Sofa.Component.Collision.Response.Contact' />
253+ )" ;
254+ std::string scenePipeline = R"( "
255+ <CollisionPipeline verbose="0" />
256+ <BruteForceBroadPhase/>
257+ <BVHNarrowPhase/>
258+ <CollisionResponse name="Response" response="PenalityContactForceField" />
259+ <DiscreteIntersection />
260+ )" ;
261+ std::string sceneModel = R"( "
262+ <Node name='Collision'>
263+ <MechanicalObject position="1 1 1" />
264+ <SphereCollisionModel name="Floor" radius="1" />
265+ </Node>
266+ )" ;
267+ std::string sceneSuffix = R"( "
268+ </Node>
269+ )" ;
270+ std::string scene = scenePrefix;
271+ if (withPipeline)
272+ {
273+ scene += scenePipeline;
274+ }
275+ if (withCollisionModel)
276+ {
277+ scene += sceneModel;
278+ }
279+ scene += sceneSuffix;
280+
281+ SceneCheckerVisitor checker (sofa::core::execparams::defaultInstance ());
282+ checker.addCheck ( SceneCheckCollisionPipelineAndModels::newSPtr () );
283+
284+ SceneLoaderXML sceneLoader;
285+ const Node::SPtr root = sceneLoader.doLoadFromMemory (" testscene" , scene.c_str ());
286+ ASSERT_NE (root.get (), nullptr );
287+ root->init (sofa::core::execparams::defaultInstance ());
288+
289+ if (!withPipeline && !withCollisionModel)
290+ {
291+ EXPECT_MSG_NOEMIT (Warning);
292+ checker.validate (root.get (), &sceneLoader);
293+ }
294+ if (withPipeline && !withCollisionModel)
295+ {
296+ EXPECT_MSG_EMIT (Warning);
297+ checker.validate (root.get (), &sceneLoader);
298+ }
299+ if (!withPipeline && withCollisionModel)
300+ {
301+ EXPECT_MSG_EMIT (Warning);
302+ checker.validate (root.get (), &sceneLoader);
303+ }
304+ if (withPipeline && withCollisionModel)
305+ {
306+ EXPECT_MSG_NOEMIT (Warning);
307+ checker.validate (root.get (), &sceneLoader);
308+ }
309+
310+ }
241311};
242312
243313TEST_F (SceneChecker_test, checkMissingRequiredPlugin )
@@ -279,3 +349,20 @@ TEST_F(SceneChecker_test, checkUsingAlias_withoutAlias )
279349{
280350 checkUsingAlias (false );
281351}
352+
353+ TEST_F (SceneChecker_test, checkCollisionPipelineModels_nothing )
354+ {
355+ checkCollisionPipelineModels (false , false );
356+ }
357+ TEST_F (SceneChecker_test, checkCollisionPipelineModels_onlyPipeline )
358+ {
359+ checkCollisionPipelineModels (true , false );
360+ }
361+ TEST_F (SceneChecker_test, checkCollisionPipelineModels_onlyModel )
362+ {
363+ checkCollisionPipelineModels (false , true );
364+ }
365+ TEST_F (SceneChecker_test, checkCollisionPipelineModels_both )
366+ {
367+ checkCollisionPipelineModels (true , true );
368+ }
0 commit comments