From 126cd3d7ef2a1c38ea9c0918173a4b38deae8314 Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Fri, 13 Dec 2019 14:00:40 +0100
Subject: [PATCH] test/capsule: add failing tests

---
 test/capsule_capsule.cpp | 107 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 107 insertions(+)

diff --git a/test/capsule_capsule.cpp b/test/capsule_capsule.cpp
index 09aa46de..4aef9377 100644
--- a/test/capsule_capsule.cpp
+++ b/test/capsule_capsule.cpp
@@ -99,6 +99,113 @@ BOOST_AUTO_TEST_CASE(collision_capsule_capsule_trivial)
   }
 }
 
+BOOST_AUTO_TEST_CASE(collision_capsule_capsule_aligned)
+{
+  const double radius = 0.01;
+  const double length = 0.2;
+  
+  CollisionGeometryPtr_t c1 (new Capsule (radius, length));
+  CollisionGeometryPtr_t c2 (new Capsule (radius, length));
+
+  int num_tests = 1e6;
+  
+  Transform3f tf1;
+  Transform3f tf2;
+  
+  Eigen::Vector3d p1 = Eigen::Vector3d::Zero();
+  Eigen::Vector3d p2_no_collision = Eigen::Vector3d(0.,0.,2*(length/2. + radius) + 1e-3); // because capsule are along the Z axis
+  
+  for(int i = 0; i < num_tests; ++i)
+  {
+    Eigen::Matrix3d rot = Eigen::Quaterniond::UnitRandom().toRotationMatrix();
+
+    tf1.setTranslation(p1); tf1.setRotation(rot);
+    tf2.setTranslation(p2_no_collision); tf2.setRotation(rot);
+    
+    CollisionObject capsule_o1 (c1, tf1);
+    CollisionObject capsule_o2 (c2, tf2);
+    
+    // Enable computation of nearest points
+    CollisionRequest collisionRequest;
+    CollisionResult capsule_collisionResult;
+    
+    size_t capsule_num_collisions = collide(&capsule_o1, &capsule_o2, collisionRequest, capsule_collisionResult);
+    
+    BOOST_CHECK(capsule_num_collisions == 0);
+  }
+  
+  Eigen::Vector3d p2_with_collision = Eigen::Vector3d(0.,0.,std::min(length/2.,radius)*(1.-1e-2));
+  for(int i = 0; i < num_tests; ++i)
+  {
+    Eigen::Matrix3d rot = Eigen::Quaterniond::UnitRandom().toRotationMatrix();
+
+    tf1.setTranslation(p1); tf1.setRotation(rot);
+    tf2.setTranslation(p2_with_collision); tf2.setRotation(rot);
+    
+    CollisionObject capsule_o1 (c1, tf1);
+    CollisionObject capsule_o2 (c2, tf2);
+    
+    // Enable computation of nearest points
+    CollisionRequest collisionRequest;
+    CollisionResult capsule_collisionResult;
+    
+    size_t capsule_num_collisions = collide(&capsule_o1, &capsule_o2, collisionRequest, capsule_collisionResult);
+    
+    BOOST_CHECK(capsule_num_collisions > 0);
+  }
+  
+  p2_no_collision = Eigen::Vector3d(0.,0.,2*(length/2. + radius) + 1e-3);
+  
+  Transform3f geom1_placement(Eigen::Matrix3d::Identity(),Eigen::Vector3d::Zero());
+  Transform3f geom2_placement(Eigen::Matrix3d::Identity(),p2_no_collision);
+  
+  for(int i = 0; i < num_tests; ++i)
+  {
+    Eigen::Matrix3d rot = Eigen::Quaterniond::UnitRandom().toRotationMatrix();
+    Eigen::Vector3d trans = Eigen::Vector3d::Random();
+
+    Transform3f displacement(rot,trans);
+    Transform3f tf1 = displacement * geom1_placement;
+    Transform3f tf2 = displacement * geom2_placement;
+    
+    CollisionObject capsule_o1 (c1, tf1);
+    CollisionObject capsule_o2 (c2, tf2);
+    
+    // Enable computation of nearest points
+    CollisionRequest collisionRequest;
+    CollisionResult capsule_collisionResult;
+    
+    size_t capsule_num_collisions = collide(&capsule_o1, &capsule_o2, collisionRequest, capsule_collisionResult);
+    
+    BOOST_CHECK(capsule_num_collisions == 0);
+  }
+  
+//  p2_with_collision = Eigen::Vector3d(0.,0.,std::min(length/2.,radius)*(1.-1e-2));
+  p2_with_collision = Eigen::Vector3d(0.,0.,0.01);
+  geom2_placement.setTranslation(p2_with_collision);
+  
+  for(int i = 0; i < num_tests; ++i)
+  {
+    Eigen::Matrix3d rot = Eigen::Quaterniond::UnitRandom().toRotationMatrix();
+    Eigen::Vector3d trans = Eigen::Vector3d::Random();
+
+    Transform3f displacement(rot,trans);
+    Transform3f tf1 = displacement * geom1_placement;
+    Transform3f tf2 = displacement * geom2_placement;
+    
+    CollisionObject capsule_o1 (c1, tf1);
+    CollisionObject capsule_o2 (c2, tf2);
+    
+    // Enable computation of nearest points
+    CollisionRequest collisionRequest;
+    CollisionResult capsule_collisionResult;
+    
+    size_t capsule_num_collisions = collide(&capsule_o1, &capsule_o2, collisionRequest, capsule_collisionResult);
+    
+    BOOST_CHECK(capsule_num_collisions > 0);
+  }
+}
+
 BOOST_AUTO_TEST_CASE(distance_capsulecapsule_origin)
 {
   CollisionGeometryPtr_t s1 (new Capsule (5, 10));
-- 
GitLab