aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2008-09-03 22:35:45 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2008-09-03 22:35:45 +0000
commit52406aecadd5677f5cb5507a546ed2f68069e61f (patch)
tree4a1abe9f3006838420143a411bf667d76dc62535 /test
parentc29c7b0ea95b86f73d77224efb26f96abdc189ac (diff)
* Extend a bit ParametrizedLine and move it to a separate file,
add unit-tests for it. * remove "using namespace std" in test/main.h such that the compilation bug found today in SVD won't happen again.
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/geometry.cpp2
-rw-r--r--test/hyperplane.cpp5
-rw-r--r--test/main.h19
-rw-r--r--test/parametrizedline.cpp69
5 files changed, 84 insertions, 12 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 505cfd70d..4a58aa8f7 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -120,6 +120,7 @@ EI_ADD_TEST(eigensolver)
EI_ADD_TEST(svd)
EI_ADD_TEST(geometry)
EI_ADD_TEST(hyperplane)
+EI_ADD_TEST(parametrizedline)
EI_ADD_TEST(regression)
EI_ADD_TEST(sparse)
diff --git a/test/geometry.cpp b/test/geometry.cpp
index 10e6bbe92..cb9726346 100644
--- a/test/geometry.cpp
+++ b/test/geometry.cpp
@@ -74,7 +74,7 @@ template<typename Scalar> void geometry(void)
VERIFY_IS_APPROX(v0, AngleAxis(a, v0.normalized()) * v0);
VERIFY_IS_APPROX(-v0, AngleAxis(M_PI, v0.unitOrthogonal()) * v0);
- VERIFY_IS_APPROX(cos(a)*v0.norm2(), v0.dot(AngleAxis(a, v0.unitOrthogonal()) * v0));
+ VERIFY_IS_APPROX(ei_cos(a)*v0.norm2(), v0.dot(AngleAxis(a, v0.unitOrthogonal()) * v0));
m = AngleAxis(a, v0.normalized()).toRotationMatrix().adjoint();
VERIFY_IS_APPROX(Matrix3::Identity(), m * AngleAxis(a, v0.normalized()));
VERIFY_IS_APPROX(Matrix3::Identity(), AngleAxis(a, v0.normalized()) * m);
diff --git a/test/hyperplane.cpp b/test/hyperplane.cpp
index 3ebdf4e6d..0418c71b2 100644
--- a/test/hyperplane.cpp
+++ b/test/hyperplane.cpp
@@ -2,6 +2,7 @@
// for linear algebra. Eigen itself is part of the KDE project.
//
// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob@math.jussieu.fr>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
@@ -54,7 +55,6 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane)
Scalar s1 = ei_random<Scalar>();
VERIFY_IS_APPROX( n1.dot(n1), Scalar(1) );
- VERIFY_IS_APPROX( n1.dot(n1), Scalar(1) );
VERIFY_IS_MUCH_SMALLER_THAN( pl0.absDistance(p0), Scalar(1) );
VERIFY_IS_APPROX( pl1.signedDistance(p1 + n1 * s0), s0 );
@@ -96,6 +96,9 @@ template<typename Scalar> void lines()
Vector u = Vector::Random();
Vector v = Vector::Random();
Scalar a = ei_random<Scalar>();
+ while (ei_abs(a-1) < 1e-4) a = ei_random<Scalar>();
+ while (u.norm() < 1e-4) u = Vector::Random();
+ while (v.norm() < 1e-4) v = Vector::Random();
HLine line_u = HLine::Through(center + u, center + a*u);
HLine line_v = HLine::Through(center + v, center + a*v);
diff --git a/test/main.h b/test/main.h
index 4e9621543..5079fdb5b 100644
--- a/test/main.h
+++ b/test/main.h
@@ -229,7 +229,6 @@ inline bool test_ei_isMuchSmallerThan(const MatrixBase<Derived>& m,
void EI_PP_CAT(test_,EIGEN_TEST_FUNC)();
using namespace Eigen;
-using namespace std;
int main(int argc, char *argv[])
{
@@ -245,14 +244,14 @@ int main(int argc, char *argv[])
{
if(has_set_repeat)
{
- cout << "Argument " << argv[i] << " conflicting with a former argument" << endl;
+ std::cout << "Argument " << argv[i] << " conflicting with a former argument" << std::endl;
return 1;
}
repeat = atoi(argv[i]+1);
has_set_repeat = true;
if(repeat <= 0)
{
- cout << "Invalid \'repeat\' value " << argv[i]+1 << endl;
+ std::cout << "Invalid \'repeat\' value " << argv[i]+1 << std::endl;
return 1;
}
}
@@ -260,7 +259,7 @@ int main(int argc, char *argv[])
{
if(has_set_seed)
{
- cout << "Argument " << argv[i] << " conflicting with a former argument" << endl;
+ std::cout << "Argument " << argv[i] << " conflicting with a former argument" << std::endl;
return 1;
}
seed = strtoul(argv[i]+1, 0, 10);
@@ -268,7 +267,7 @@ int main(int argc, char *argv[])
bool ok = seed!=0;
if(!ok)
{
- cout << "Invalid \'seed\' value " << argv[i]+1 << endl;
+ std::cout << "Invalid \'seed\' value " << argv[i]+1 << std::endl;
return 1;
}
}
@@ -280,18 +279,18 @@ int main(int argc, char *argv[])
if(need_help)
{
- cout << "This test application takes the following optional arguments:" << endl;
- cout << " rN Repeat each test N times (default: " << DEFAULT_REPEAT << ")" << endl;
- cout << " sN Use N as seed for random numbers (default: based on current time)" << endl;
+ std::cout << "This test application takes the following optional arguments:" << std::endl;
+ std::cout << " rN Repeat each test N times (default: " << DEFAULT_REPEAT << ")" << std::endl;
+ std::cout << " sN Use N as seed for random numbers (default: based on current time)" << std::endl;
return 1;
}
if(!has_set_seed) seed = (unsigned int) time(NULL);
if(!has_set_repeat) repeat = DEFAULT_REPEAT;
- cout << "Initializing random number generator with seed " << seed << endl;
+ std::cout << "Initializing random number generator with seed " << seed << std::endl;
srand(seed);
- cout << "Repeating each test " << repeat << " times" << endl;
+ std::cout << "Repeating each test " << repeat << " times" << std::endl;
Eigen::g_repeat = repeat;
Eigen::g_test_stack.push_back(EI_PP_MAKE_STRING(EIGEN_TEST_FUNC));
diff --git a/test/parametrizedline.cpp b/test/parametrizedline.cpp
new file mode 100644
index 000000000..82962807d
--- /dev/null
+++ b/test/parametrizedline.cpp
@@ -0,0 +1,69 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob@math.jussieu.fr>
+//
+// Eigen is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or (at your option) any later version.
+//
+// Alternatively, you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License and a copy of the GNU General Public License along with
+// Eigen. If not, see <http://www.gnu.org/licenses/>.
+
+#include "main.h"
+#include <Eigen/Geometry>
+#include <Eigen/LU>
+#include <Eigen/QR>
+
+template<typename LineType> void parametrizedline(const LineType& _line)
+{
+ /* this test covers the following files:
+ ParametrizedLine.h
+ */
+
+ const int dim = _line.dim();
+ typedef typename LineType::Scalar Scalar;
+ typedef typename NumTraits<Scalar>::Real RealScalar;
+ typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType;
+ typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime,
+ LineType::AmbientDimAtCompileTime> MatrixType;
+
+ VectorType p0 = VectorType::Random(dim);
+ VectorType p1 = VectorType::Random(dim);
+
+ VectorType d0 = VectorType::Random(dim).normalized();
+
+ LineType l0(p0, d0);
+
+ Scalar s0 = ei_random<Scalar>();
+ Scalar s1 = ei_abs(ei_random<Scalar>());
+
+ VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0), RealScalar(1) );
+ VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0+s0*d0), RealScalar(1) );
+ VERIFY_IS_APPROX( (l0.projection(p1)-p1).norm(), l0.distance(p1) );
+ VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(l0.projection(p1)), RealScalar(1) );
+ VERIFY_IS_APPROX( l0.distance((p0+s0*d0) + d0.unitOrthogonal() * s1), s1 );
+}
+
+void test_parametrizedline()
+{
+ for(int i = 0; i < g_repeat; i++) {
+ CALL_SUBTEST( parametrizedline(ParametrizedLine<float,2>()) );
+ CALL_SUBTEST( parametrizedline(ParametrizedLine<float,3>()) );
+ CALL_SUBTEST( parametrizedline(ParametrizedLine<double,4>()) );
+ CALL_SUBTEST( parametrizedline(ParametrizedLine<std::complex<double>,5>()) );
+ }
+}