GCC Code Coverage Report


Directory: ./
File: test/convex.cpp
Date: 2025-04-01 09:23:31
Exec Total Coverage
Lines: 73 73 100.0%
Branches: 329 650 50.6%

Line Branch Exec Source
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2019, LAAS-CNRS
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of Open Source Robotics Foundation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 */
34
35 /** \author Joseph Mirabel */
36
37 #define BOOST_TEST_MODULE COAL_GEOMETRIC_SHAPES
38 #include <boost/test/included/unit_test.hpp>
39
40 #include "coal/shape/convex.h"
41 #include "coal/collision.h"
42 #include "coal/distance.h"
43
44 #include "utility.h"
45
46 using namespace coal;
47
48
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(convex) {
49 2 Scalar l = 1, w = 1, d = 1;
50
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Convex<Quadrilateral> box(buildBox(l, w, d));
51
52 // Check neighbors
53
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
18 for (size_t i = 0; i < 8; ++i) {
54
5/10
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 8 times.
16 BOOST_CHECK_EQUAL((*box.neighbors)[i].count(), 3);
55 }
56
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[0][0], 1);
57
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[0][1], 2);
58
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[0][2], 4);
59
60
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[1][0], 0);
61
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[1][1], 3);
62
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[1][2], 5);
63
64
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[2][0], 0);
65
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[2][1], 3);
66
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[2][2], 6);
67
68
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[3][0], 1);
69
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[3][1], 2);
70
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[3][2], 7);
71
72
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[4][0], 0);
73
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[4][1], 5);
74
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[4][2], 6);
75
76
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[5][0], 1);
77
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[5][1], 4);
78
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[5][2], 7);
79
80
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[6][0], 2);
81
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[6][1], 4);
82
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[6][2], 7);
83
84
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[7][0], 3);
85
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[7][1], 5);
86
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL((*box.neighbors)[7][2], 6);
87 2 }
88
89 template <typename Sa, typename Sb>
90 1002 void compareShapeIntersection(const Sa& sa, const Sb& sb,
91 const Transform3s& tf1, const Transform3s& tf2,
92 Scalar tol = Scalar(1e-9)) {
93
1/2
✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
1002 CollisionRequest request(CONTACT | DISTANCE_LOWER_BOUND, 1);
94
2/4
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1002 times.
✗ Branch 5 not taken.
1002 CollisionResult resA, resB;
95
96
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 collide(&sa, tf1, &sa, tf2, request, resA);
97
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 collide(&sb, tf1, &sb, tf2, request, resB);
98
99
5/10
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 1002 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1002 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1002 times.
1002 BOOST_CHECK_EQUAL(resA.isCollision(), resB.isCollision());
100
5/10
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 1002 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1002 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1002 times.
1002 BOOST_CHECK_EQUAL(resA.numContacts(), resB.numContacts());
101
102
5/6
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 993 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 993 times.
1002 if (resA.isCollision() && resB.isCollision()) {
103
4/8
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
9 Contact cA = resA.getContact(0), cB = resB.getContact(0);
104
105
15/30
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 9 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 9 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 9 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 9 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 9 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 9 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 9 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 9 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 9 times.
✗ Branch 37 not taken.
✓ Branch 39 taken 9 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 9 times.
✗ Branch 43 not taken.
✓ Branch 45 taken 9 times.
✗ Branch 46 not taken.
9 BOOST_TEST_MESSAGE(tf1 << '\n'
106 << cA.pos.format(pyfmt) << '\n'
107 << '\n'
108 << tf2 << '\n'
109 << cB.pos.format(pyfmt) << '\n');
110 // Only warnings because there are still some bugs.
111
7/14
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 9 times.
9 BOOST_WARN_SMALL((cA.pos - cB.pos).squaredNorm(), tol);
112
7/14
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 9 times.
9 BOOST_WARN_SMALL((cA.normal - cB.normal).squaredNorm(), tol);
113 } else {
114
6/12
✓ Branch 1 taken 993 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 993 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 993 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 993 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 993 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 993 times.
993 BOOST_CHECK_CLOSE(resA.distance_lower_bound, resB.distance_lower_bound,
115 tol); // distances should be same
116 }
117 1002 }
118
119 template <typename Sa, typename Sb>
120 1002 void compareShapeDistance(const Sa& sa, const Sb& sb, const Transform3s& tf1,
121 const Transform3s& tf2, Scalar tol = Scalar(1e-9)) {
122
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 DistanceRequest request(true);
123
2/4
✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1002 times.
✗ Branch 7 not taken.
1002 DistanceResult resA, resB;
124
125
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 distance(&sa, tf1, &sa, tf2, request, resA);
126
1/2
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
1002 distance(&sb, tf1, &sb, tf2, request, resB);
127
128
27/54
✓ Branch 2 taken 1002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1002 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1002 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1002 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1002 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1002 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1002 times.
✗ Branch 25 not taken.
✓ Branch 28 taken 1002 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1002 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1002 times.
✗ Branch 35 not taken.
✓ Branch 38 taken 1002 times.
✗ Branch 39 not taken.
✓ Branch 41 taken 1002 times.
✗ Branch 42 not taken.
✓ Branch 44 taken 1002 times.
✗ Branch 45 not taken.
✓ Branch 47 taken 1002 times.
✗ Branch 48 not taken.
✓ Branch 50 taken 1002 times.
✗ Branch 51 not taken.
✓ Branch 53 taken 1002 times.
✗ Branch 54 not taken.
✓ Branch 56 taken 1002 times.
✗ Branch 57 not taken.
✓ Branch 59 taken 1002 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 1002 times.
✗ Branch 63 not taken.
✓ Branch 66 taken 1002 times.
✗ Branch 67 not taken.
✓ Branch 69 taken 1002 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 1002 times.
✗ Branch 73 not taken.
✓ Branch 76 taken 1002 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1002 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1002 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1002 times.
✗ Branch 86 not taken.
1002 BOOST_TEST_MESSAGE(tf1 << '\n'
129 << resA.normal.format(pyfmt) << '\n'
130 << resA.nearest_points[0].format(pyfmt) << '\n'
131 << resA.nearest_points[1].format(pyfmt) << '\n'
132 << '\n'
133 << tf2 << '\n'
134 << resB.normal.format(pyfmt) << '\n'
135 << resB.nearest_points[0].format(pyfmt) << '\n'
136 << resB.nearest_points[1].format(pyfmt) << '\n');
137 // TODO in one case, there is a mismatch between the distances and I cannot
138 // say which one is correct. To visualize the case, use script
139 // test/geometric_shapes.py
140
6/12
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1002 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1002 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1002 times.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1002 times.
1002 BOOST_WARN_CLOSE(resA.min_distance, resB.min_distance, tol);
141 // BOOST_CHECK_CLOSE(resA.min_distance, resB.min_distance, tol);
142
143 // Only warnings because there are still some bugs.
144
7/14
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1002 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1002 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1002 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1002 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1002 times.
1002 BOOST_WARN_SMALL((resA.normal - resA.normal).squaredNorm(), tol);
145
7/14
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1002 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1002 times.
✗ Branch 14 not taken.
✓ Branch 18 taken 1002 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1002 times.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1002 times.
1002 BOOST_WARN_SMALL(
146 (resA.nearest_points[0] - resB.nearest_points[0]).squaredNorm(), tol);
147
7/14
✓ Branch 1 taken 1002 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1002 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1002 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1002 times.
✗ Branch 14 not taken.
✓ Branch 18 taken 1002 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1002 times.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1002 times.
1002 BOOST_WARN_SMALL(
148 (resA.nearest_points[1] - resB.nearest_points[1]).squaredNorm(), tol);
149 1002 }
150
151
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(compare_convex_box) {
152 2 Scalar extents[6] = {0, 0, 0, 10, 10, 10};
153 2 Scalar l = 1, w = 1, d = 1, eps = Scalar(1e-4);
154
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Box box(l * 2, w * 2, d * 2);
155
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Convex<Quadrilateral> convex_box(buildBox(l, w, d));
156
157
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf1;
158
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2;
159
160
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(3, 0, 0));
161
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeIntersection(box, convex_box, tf1, tf2, eps);
162
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeDistance(box, convex_box, tf1, tf2, eps);
163
164
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 tf2.setTranslation(Vec3s(0, 0, 0));
165
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeIntersection(box, convex_box, tf1, tf2, eps);
166
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 compareShapeDistance(box, convex_box, tf1, tf2, eps);
167
168
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
2002 for (int i = 0; i < 1000; ++i) {
169
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 generateRandomTransform(extents, tf2);
170
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 compareShapeIntersection(box, convex_box, tf1, tf2, eps);
171
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 compareShapeDistance(box, convex_box, tf1, tf2, eps);
172 }
173 2 }
174
175 #ifdef COAL_HAS_QHULL
176 BOOST_AUTO_TEST_CASE(convex_hull_throw) {
177 std::shared_ptr<std::vector<Vec3s>> points(
178 new std::vector<Vec3s>({Vec3s(1, 1, 1), Vec3s(0, 0, 0), Vec3s(1, 0, 0)}));
179
180 BOOST_CHECK_THROW(ConvexBase::convexHull(points, 0, false, NULL),
181 std::invalid_argument);
182 BOOST_CHECK_THROW(ConvexBase::convexHull(points, 1, false, NULL),
183 std::invalid_argument);
184 BOOST_CHECK_THROW(ConvexBase::convexHull(points, 2, false, NULL),
185 std::invalid_argument);
186 BOOST_CHECK_THROW(ConvexBase::convexHull(points, 3, false, NULL),
187 std::invalid_argument);
188 }
189
190 BOOST_AUTO_TEST_CASE(convex_hull_quad) {
191 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
192 Vec3s(1, 1, 1),
193 Vec3s(0, 0, 0),
194 Vec3s(1, 0, 0),
195 Vec3s(0, 0, 1),
196 }));
197
198 ConvexBase* convexHull = ConvexBase::convexHull(points, 4, false, NULL);
199
200 BOOST_REQUIRE_EQUAL(convexHull->num_points, 4);
201 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[0].count(), 3);
202 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[1].count(), 3);
203 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[2].count(), 3);
204 delete convexHull;
205 }
206
207 BOOST_AUTO_TEST_CASE(convex_hull_box_like) {
208 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
209 Vec3s(1, 1, 1),
210 Vec3s(1, 1, -1),
211 Vec3s(1, -1, 1),
212 Vec3s(1, -1, -1),
213 Vec3s(-1, 1, 1),
214 Vec3s(-1, 1, -1),
215 Vec3s(-1, -1, 1),
216 Vec3s(-1, -1, -1),
217 Vec3s(0, 0, 0),
218 Vec3s(0, 0, Scalar(0.99)),
219 }));
220
221 ConvexBase* convexHull = ConvexBase::convexHull(points, 9, false, NULL);
222
223 BOOST_REQUIRE_EQUAL(8, convexHull->num_points);
224 {
225 const std::vector<Vec3s>& cvxhull_points = *(convexHull->points);
226 for (size_t i = 0; i < 8; ++i) {
227 BOOST_CHECK(cvxhull_points[i].cwiseAbs() == Vec3s(1, 1, 1));
228 BOOST_CHECK_EQUAL((*(convexHull->neighbors))[i].count(), 3);
229 }
230 }
231 delete convexHull;
232
233 convexHull = ConvexBase::convexHull(points, 9, true, NULL);
234 Convex<Triangle>* convex_tri = dynamic_cast<Convex<Triangle>*>(convexHull);
235 BOOST_CHECK(convex_tri != NULL);
236
237 BOOST_REQUIRE_EQUAL(8, convexHull->num_points);
238 {
239 const std::vector<Vec3s>& cvxhull_points = *(convexHull->points);
240 for (size_t i = 0; i < 8; ++i) {
241 BOOST_CHECK(cvxhull_points[i].cwiseAbs() == Vec3s(1, 1, 1));
242 BOOST_CHECK((*(convexHull->neighbors))[i].count() >= 3);
243 BOOST_CHECK((*(convexHull->neighbors))[i].count() <= 6);
244 }
245 }
246 delete convexHull;
247 }
248
249 BOOST_AUTO_TEST_CASE(convex_copy_constructor) {
250 Convex<Triangle>* convexHullTriCopy;
251 {
252 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
253 Vec3s(1, 1, 1),
254 Vec3s(1, 1, -1),
255 Vec3s(1, -1, 1),
256 Vec3s(1, -1, -1),
257 Vec3s(-1, 1, 1),
258 Vec3s(-1, 1, -1),
259 Vec3s(-1, -1, 1),
260 Vec3s(-1, -1, -1),
261 Vec3s(0, 0, 0),
262 }));
263
264 Convex<Triangle>* convexHullTri = dynamic_cast<Convex<Triangle>*>(
265 ConvexBase::convexHull(points, 9, true, NULL));
266 convexHullTriCopy = new Convex<Triangle>(*convexHullTri);
267 BOOST_CHECK(*convexHullTri == *convexHullTriCopy);
268 }
269 Convex<Triangle>* convexHullTriCopyOfCopy =
270 new Convex<Triangle>(*convexHullTriCopy);
271 BOOST_CHECK(*convexHullTriCopyOfCopy == *convexHullTriCopy);
272 }
273
274 BOOST_AUTO_TEST_CASE(convex_clone) {
275 std::shared_ptr<std::vector<Vec3s>> points(new std::vector<Vec3s>({
276 Vec3s(1, 1, 1),
277 Vec3s(1, 1, -1),
278 Vec3s(1, -1, 1),
279 Vec3s(1, -1, -1),
280 Vec3s(-1, 1, 1),
281 Vec3s(-1, 1, -1),
282 Vec3s(-1, -1, 1),
283 Vec3s(-1, -1, -1),
284 Vec3s(0, 0, 0),
285 }));
286
287 Convex<Triangle>* convexHullTri = dynamic_cast<Convex<Triangle>*>(
288 ConvexBase::convexHull(points, 9, true, NULL));
289 Convex<Triangle>* convexHullTriCopy;
290 convexHullTriCopy = convexHullTri->clone();
291 BOOST_CHECK(*convexHullTri == *convexHullTriCopy);
292 }
293
294 #endif
295