1#ifndef SimTK_SimTKCOMMON_TESTING_H_
2#define SimTK_SimTKCOMMON_TESTING_H_
171 std::clog <<
"Starting test " << testName <<
" ...\n";
176 std::ostringstream fmt;
177 fmt << std::fixed << std::setprecision(1);
178 fmt <<
"\n" << testName <<
" done."
179 <<
" real/CPU ms: " << (finalRealTime-startRealTime)*1000
180 <<
" / " << (finalCpuTime-startCpuTime)*1000 <<std::endl;
181 std::clog << fmt.str();
188 template <
class T1,
class T2>
189 static double defTol2() {
return std::max(defTol<T1>(), defTol<T2>());}
197 const float scale = n*std::max(std::max(std::abs(v1), std::abs(v2)), 1.0f);
198 return std::abs(v1-v2) < scale*(float)tol;
201 const double scale = n*std::max(std::max(std::abs(v1), std::abs(v2)), 1.0);
202 return std::abs(v1-v2) < scale*(double)tol;
207 static bool numericallyEqual(
unsigned u1,
unsigned u2,
int n,
double tol=0) {
return u1==u2;}
234 static bool numericallyEqual(
const std::complex<P>& v1,
const std::complex<P>& v2,
int n,
double tol=defTol<P>()) {
281 template <
int M,
class E1,
int S1,
class E2,
int S2>
283 for (
int i=0; i<M; ++i)
if (!
numericallyEqual(v1[i],v2[i], n, tol))
return false;
286 template <
int N,
class E1,
int S1,
class E2,
int S2>
288 for (
int j=0; j<N; ++j)
if (!
numericallyEqual(v1[j],v2[j], n, tol))
return false;
291 template <
int M,
int N,
class E1,
int CS1,
int RS1,
class E2,
int CS2,
int RS2>
292 static bool numericallyEqual(
const Mat<M,N,E1,CS1,RS1>& v1,
const Mat<M,N,E2,CS2,RS2>& v2,
int n,
double tol=(defTol2<E1,E2>())) {
293 for (
int j=0; j<N; ++j)
if (!
numericallyEqual(v1(j),v2(j), n, tol))
return false;
296 template <
int N,
class E1,
int S1,
class E2,
int S2>
300 template <
class E1,
class E2>
302 if (v1.
size() != v2.
size())
return false;
303 for (
int i=0; i < v1.
size(); ++i)
307 template <
class E1,
class E2>
310 template <
class E1,
class E2>
313 template <
class E1,
class E2>
317 template <
class E1,
class E2>
319 if (v1.
size() != v2.
size())
return false;
320 for (
int i=0; i < v1.
size(); ++i)
324 template <
class E1,
class E2>
327 template <
class E1,
class E2>
330 template <
class E1,
class E2>
334 template <
class E1,
class E2>
337 for (
int j=0; j < v1.
ncol(); ++j)
341 template <
class E1,
class E2>
344 template <
class E1,
class E2>
347 template <
class E1,
class E2>
386 {
Mat<M,N> m;
for (
int j=0; j<N; ++j) m(j)=randVec<M>();
return m;}
391 {
Vector v(m);
for (
int i=0; i<m; ++i) v[i]=
randReal();
return v;}
413 const double startCpuTime;
414 const double startRealTime;
415 std::string testName;
426 std::clog <<
" " << subtestName <<
" ...\n" << std::flush;
431 std::ostringstream fmt;
432 fmt << std::fixed << std::setprecision(1);
433 fmt <<
" " << subtestName <<
" done."
434 <<
" real/CPU ms: " << (finalRealTime-startRealTime)*1000
435 <<
" / " << (finalCpuTime-startCpuTime)*1000 <<std::endl;
436 std::clog << fmt.str();
439 const double startCpuTime;
440 const double startRealTime;
441 std::string subtestName;
447#define SimTK_START_TEST(testName) \
448 SimTK::Test simtk_test_(testName); \
452#define SimTK_END_TEST() \
453 } catch(const std::exception& e) { \
454 std::cerr << "Test failed due to exception: " \
455 << e.what() << std::endl; \
458 std::cerr << "Test failed due to unrecognized exception.\n"; \
465#define SimTK_SUBTEST(testFunction) \
466 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)();} while(false)
469#define SimTK_SUBTEST1(testFunction,arg1) \
470 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1);} while(false)
473#define SimTK_SUBTEST2(testFunction,arg1,arg2) \
474 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1,arg2);} while(false)
477#define SimTK_SUBTEST3(testFunction,arg1,arg2,arg3) \
478 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1,arg2,arg3);} while(false)
481#define SimTK_SUBTEST4(testFunction,arg1,arg2,arg3,arg4) \
482 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1,arg2,arg3,arg4);} while(false)
485#define SimTK_TEST(cond) {SimTK_ASSERT_ALWAYS((cond), "Test condition failed.");}
489#define SimTK_TEST_FAILED(msg) {SimTK_ASSERT_ALWAYS(!"Test case failed.", msg);}
494#define SimTK_TEST_FAILED1(fmt,a1) {SimTK_ASSERT1_ALWAYS(!"Test case failed.",fmt,a1);}
499#define SimTK_TEST_FAILED2(fmt,a1,a2) {SimTK_ASSERT2_ALWAYS(!"Test case failed.",fmt,a1,a2);}
504#define SimTK_TEST_EQ(v1,v2) \
505 {SimTK_ASSERT_ALWAYS(SimTK::Test::numericallyEqual((v1),(v2),1), \
506 "Test values should have been numerically equivalent at default tolerance.");}
510#define SimTK_TEST_EQ_SIZE(v1,v2,n) \
511 {SimTK_ASSERT1_ALWAYS(SimTK::Test::numericallyEqual((v1),(v2),(n)), \
512 "Test values should have been numerically equivalent at size=%d times default tolerance.",(n));}
517#define SimTK_TEST_EQ_TOL(v1,v2,tol) \
518 {SimTK_ASSERT1_ALWAYS(SimTK::Test::numericallyEqual((v1),(v2),1,(tol)), \
519 "Test values should have been numerically equivalent at tolerance=%g.",(tol));}
524#define SimTK_TEST_NOTEQ(v1,v2) \
525 {SimTK_ASSERT_ALWAYS(!SimTK::Test::numericallyEqual((v1),(v2),1), \
526 "Test values should NOT have been numerically equivalent (at default tolerance).");}
531#define SimTK_TEST_NOTEQ_SIZE(v1,v2,n) \
532 {SimTK_ASSERT1_ALWAYS(!SimTK::Test::numericallyEqual((v1),(v2),(n)), \
533 "Test values should NOT have been numerically equivalent at size=%d times default tolerance.",(n));}
538#define SimTK_TEST_NOTEQ_TOL(v1,v2,tol) \
539 {SimTK_ASSERT1_ALWAYS(!SimTK::Test::numericallyEqual((v1),(v2),1,(tol)), \
540 "Test values should NOT have been numerically equivalent at tolerance=%g.",(tol));}
542#ifndef SimTK_TEST_SUPPRESS_EXPECTED_THROW
545#define SimTK_TEST_MUST_THROW(stmt) \
546 do {int threw=0; try {stmt;} \
547 catch(const std::exception&){threw=1;} \
548 catch(...){threw=2;} \
549 if (threw==0) SimTK_TEST_FAILED1("Expected statement\n----\n%s\n----\n to throw an exception but it did not.",#stmt); \
550 if (threw==2) SimTK_TEST_FAILED1("Expected statement\n%s\n to throw an std::exception but it threw something else.",#stmt); \
555#define SimTK_TEST_MUST_THROW_SHOW(stmt) \
556 do {int threw=0; try {stmt;} \
557 catch(const std::exception& e) {threw=1; \
558 std::cout << "(OK) Threw: " << e.what() << std::endl;} \
559 catch(...){threw=2;} \
560 if (threw==0) SimTK_TEST_FAILED1("Expected statement\n----\n%s\n----\n to throw an exception but it did not.",#stmt); \
561 if (threw==2) SimTK_TEST_FAILED1("Expected statement\n%s\n to throw an std::exception but it threw something else.",#stmt); \
565#define SimTK_TEST_MUST_THROW_EXC(stmt,exc) \
566 do {int threw=0; try {stmt;} \
567 catch(const exc&){threw=1;} \
568 catch(...){threw=2;} \
569 if (threw==0) SimTK_TEST_FAILED1("Expected statement\n----\n%s\n----\n to throw an exception but it did not.",#stmt); \
570 if (threw==2) SimTK_TEST_FAILED2("Expected statement\n----\n%s\n----\n to throw exception type %s but it threw something else.",#stmt,#exc); \
574#define SimTK_TEST_MAY_THROW(stmt) \
575 do {int threw=0; try {stmt;} \
576 catch(const std::exception&){threw=1;} \
577 catch(...){threw=2;} \
578 if (threw==2) SimTK_TEST_FAILED1("Expected statement\n%s\n to throw an std::exception but it threw something else.",#stmt); \
582#define SimTK_TEST_MAY_THROW_EXC(stmt,exc) \
583 do {int threw=0; try {stmt;} \
584 catch(const exc&){threw=1;} \
585 catch(...){threw=2;} \
586 if (threw==2) SimTK_TEST_FAILED2("Expected statement\n----\n%s\n----\n to throw exception type %s but it threw something else.",#stmt,#exc); \
594 #define SimTK_TEST_MUST_THROW_DEBUG(stmt)
597 #define SimTK_TEST_MUST_THROW_EXC_DEBUG(stmt,exc)
601 #define SimTK_TEST_MUST_THROW_DEBUG(stmt) SimTK_TEST_MUST_THROW(stmt)
604 #define SimTK_TEST_MUST_THROW_EXC_DEBUG(stmt,exc) \
605 SimTK_TEST_MUST_THROW_EXC(stmt,exc)
609#define SimTK_TEST_MUST_THROW(stmt)
610#define SimTK_TEST_MUST_THROW_SHOW(stmt)
611#define SimTK_TEST_MUST_THROW_EXC(stmt,exc)
612#define SimTK_TEST_MAY_THROW(stmt)
613#define SimTK_TEST_MAY_THROW_EXC(stmt,exc)
614#define SimTK_TEST_MUST_THROW_DEBUG(stmt)
615#define SimTK_TEST_MUST_THROW_EXC_DEBUG(stmt,exc)
This is the header which should be included in user programs that would like to make use of all the S...
This file ensures that we have access to the Posix time functions clock_getttime() and nanosleep(),...
Includes internal headers providing declarations for the basic SimTK Core classes.
The physical meaning of an inertia is the distribution of a rigid body's mass about a particular poin...
Definition MassProperties.h:193
const SymMat< 3, P > & asSymMat33() const
Obtain a reference to the underlying symmetric matrix type.
Definition MassProperties.h:397
This class represents a small matrix whose size is known at compile time, containing elements of any ...
Definition Mat.h:97
int nrow() const
Return the number of rows m in the logical shape of this matrix.
Definition MatrixBase.h:136
int ncol() const
Return the number of columns n in the logical shape of this matrix.
Definition MatrixBase.h:138
(Advanced) This class is identical to Matrix_ except that it has shallow (reference) copy and assignm...
Definition MatrixView_.h:43
This is the matrix class intended to appear in user code for large, variable size matrices.
Definition Matrix_.h:51
Real getValue() const
Get the next value in the pseudo-random sequence.
The Rotation class is a Mat33 that guarantees that the matrix can be interpreted as a legitimate 3x3 ...
Definition Rotation.h:111
bool isSameRotationToWithinAngle(const Rotation_ &R, RealP okPointingAngleErrorRads) const
Return true if "this" Rotation is nearly identical to "R" within a specified pointing angle error.
int size() const
Definition RowVectorBase.h:237
(Advanced) This class is identical to RowVector_ except that it has shallow (reference) copy and assi...
Definition RowVectorView_.h:42
Represents a variable size row vector; much less common than the column vector type Vector_.
Definition RowVector_.h:52
This is a fixed-length row vector designed for no-overhead inline computation.
Definition Row.h:132
This is a small, fixed-size symmetric or Hermitian matrix designed for no-overhead inline computation...
Definition SymMat.h:87
const TAsVec & getAsVec() const
Definition SymMat.h:831
TAsVec & updAsVec()
Definition SymMat.h:832
Internal utility class for generating test messages for subtests.
Definition Testing.h:419
This is the main class to support testing.
Definition Testing.h:163
A UnitInertia matrix is a unit-mass inertia matrix; you can convert it to an Inertia by multiplying i...
Definition MassProperties.h:669
This is a fixed-length column vector designed for no-overhead inline computation.
Definition Vec.h:184
int size() const
Definition VectorBase.h:396
(Advanced) This class is identical to Vector_ except that it has shallow (reference) copy and assignm...
Definition VectorView_.h:42
This is the vector class intended to appear in user code for large, variable size column vectors.
Definition Vector_.h:50
SimTK::conjugate<R> should be instantiated only for float, double.
Definition conjugate.h:178
negator<N>, where N is a number type (real, complex, conjugate), is represented in memory identically...
Definition negator.h:75
double cpuTime()
Return the cumulative CPU time in seconds (both kernel and user time) that has been used so far by an...
Definition Timing.h:228
double realTime()
Return current time on the high-resolution interval timer in seconds.
Definition Timing.h:290
Test(const std::string &name)
Definition Testing.h:166
static Real randReal()
Definition Testing.h:373
static bool numericallyEqual(const VectorView_< E1 > &v1, const Vector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:314
static SpatialVec randSpatialVec()
Definition Testing.h:398
static bool numericallyEqual(const Inertia_< P > &I1, const Inertia_< P > &I2, int n, double tol=defTol< P >())
Definition Testing.h:368
static bool numericallyEqual(const conjugate< P > &v1, const negator< std::complex< P > > &v2, int n, double tol=defTol< P >())
Definition Testing.h:278
static bool numericallyEqual(const RowVector_< E1 > &v1, const RowVectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:328
static bool numericallyEqual(const MatrixView_< E1 > &m1, const Matrix_< E2 > &m2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:348
static bool numericallyEqual(const negator< P > &v1, const P &v2, int n, double tol=defTol< P >())
Definition Testing.h:262
static bool numericallyEqual(const Matrix_< E1 > &m1, const Matrix_< E2 > &m2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:342
static bool numericallyEqual(const UnitInertia_< P > &G1, const UnitInertia_< P > &G2, int n, double tol=defTol< P >())
Definition Testing.h:363
static double defTol2()
Definition Testing.h:189
static float randFloat()
Definition Testing.h:379
static bool numericallyEqual(double v1, double v2, int n, double tol=defTol< double >())
Definition Testing.h:200
static double defTol()
Definition Testing.h:185
static bool numericallyEqual(double f1, int i2, int n, double tol=defTol< double >())
Definition Testing.h:226
static bool numericallyEqual(const RowVectorView_< E1 > &v1, const RowVector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:331
static Vec3 randVec3()
Definition Testing.h:395
static bool numericallyEqual(int i1, double f2, int n, double tol=defTol< double >())
Definition Testing.h:224
static bool numericallyEqual(unsigned u1, unsigned u2, int n, double tol=0)
Definition Testing.h:207
static double randDouble()
Definition Testing.h:380
static bool numericallyEqual(const negator< conjugate< P > > &v1, const std::complex< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:270
static Mat< M, N > randMat()
Definition Testing.h:385
static Complex randComplex()
Definition Testing.h:377
static Row< N > randRow()
Definition Testing.h:384
static bool numericallyEqual(const std::complex< P > &v1, const conjugate< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:244
static bool numericallyEqual(const Rotation_< P > &R1, const Rotation_< P > &R2, int n, double tol=defTol< P >())
Definition Testing.h:352
static Vector randVector(int m)
Definition Testing.h:390
static bool numericallyEqual(const negator< P > &v1, const negator< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:254
static bool numericallyEqual(const RowVector_< E1 > &v1, const RowVector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:325
static bool numericallyEqual(const std::complex< P > &v1, const std::complex< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:234
static SymMat< N > randSymMat()
Definition Testing.h:387
static bool numericallyEqual(float f1, int i2, int n, double tol=defTol< float >())
Definition Testing.h:218
static Mat33 randMat33()
Definition Testing.h:396
Subtest(const std::string &name)
Definition Testing.h:421
static bool numericallyEqual(int i1, float f2, int n, double tol=defTol< float >())
Definition Testing.h:216
static bool numericallyEqual(double f1, unsigned i2, int n, double tol=defTol< double >())
Definition Testing.h:230
static bool numericallyEqual(double v1, float v2, int n, double tol=defTol< float >())
Definition Testing.h:212
static bool numericallyEqual(const SymMat< N, E1, S1 > &v1, const SymMat< N, E2, S2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:297
~Test()
Definition Testing.h:173
static bool numericallyEqual(const P &v1, const negator< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:258
static Transform randTransform()
Definition Testing.h:409
static SymMat33 randSymMat33()
Definition Testing.h:397
static bool numericallyEqual(const Row< N, E1, S1 > &v1, const Row< N, E2, S2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:287
static bool numericallyEqual(const Mat< M, N, E1, CS1, RS1 > &v1, const Mat< M, N, E2, CS2, RS2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:292
static bool numericallyEqual(const conjugate< P > &v1, const conjugate< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:239
static bool numericallyEqual(const Vector_< E1 > &v1, const VectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:311
static Vec< M > randVec()
Definition Testing.h:382
~Subtest()
Definition Testing.h:428
static bool numericallyEqual(const MatrixView_< E1 > &v1, const MatrixView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:335
static bool numericallyEqual(float f1, unsigned i2, int n, double tol=defTol< float >())
Definition Testing.h:222
static Rotation randRotation()
Definition Testing.h:405
static bool numericallyEqual(const Vector_< E1 > &v1, const Vector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:308
static bool numericallyEqual(const Matrix_< E1 > &m1, const MatrixView_< E2 > &m2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:345
static bool numericallyEqual(const Vec< M, E1, S1 > &v1, const Vec< M, E2, S2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:282
static bool numericallyEqual(const std::complex< P > &v1, const negator< conjugate< P > > &v2, int n, double tol=defTol< P >())
Definition Testing.h:274
static bool numericallyEqual(const conjugate< P > &v1, const std::complex< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:249
static bool numericallyEqual(const RowVectorView_< E1 > &v1, const RowVectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:318
static bool numericallyEqual(const Transform_< P > &T1, const Transform_< P > &T2, int n, double tol=defTol< P >())
Definition Testing.h:357
static bool numericallyEqual(const VectorView_< E1 > &v1, const VectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition Testing.h:301
static bool numericallyEqual(const negator< std::complex< P > > &v1, const conjugate< P > &v2, int n, double tol=defTol< P >())
Definition Testing.h:266
static bool numericallyEqual(int i1, int i2, int n, double tol=0)
Definition Testing.h:206
static Conjugate randConjugate()
Definition Testing.h:378
static bool numericallyEqual(unsigned i1, double f2, int n, double tol=defTol< double >())
Definition Testing.h:228
static SpatialMat randSpatialMat()
Definition Testing.h:401
static Matrix randMatrix(int m, int n)
Definition Testing.h:392
static bool numericallyEqual(float v1, float v2, int n, double tol=defTol< float >())
Definition Testing.h:196
static bool numericallyEqual(unsigned i1, float f2, int n, double tol=defTol< float >())
Definition Testing.h:220
static bool numericallyEqual(float v1, double v2, int n, double tol=defTol< float >())
Definition Testing.h:210
Vec< 2, Vec3 > SpatialVec
Spatial vectors are used for (rotation,translation) quantities and consist of a pair of Vec3 objects,...
Definition MassProperties.h:50
Mat< 2, 2, Mat33 > SpatialMat
Spatial matrices are used to hold 6x6 matrices that are best viewed as 2x2 matrices of 3x3 matrices; ...
Definition MassProperties.h:72
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37
Rotation_< Real > Rotation
Definition Rotation.h:49
std::complex< Real > Complex
This is the default complex type for SimTK, with precision for the real and imaginary parts set to th...
Definition SimTKcommon/include/SimTKcommon/internal/common.h:609
conjugate< Real > Conjugate
Definition Scalar.h:57
SimTK_Real Real
This is the default compiled-in floating point type for SimTK, either float or double.
Definition SimTKcommon/include/SimTKcommon/internal/common.h:606
Transform_< Real > Transform
Definition Transform.h:46