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>
198 return std::abs(v1-v2) < scale*(float)tol;
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
Definition: NTraits.h:436
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 Row< N > randRow()
Definition: Testing.h:384
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 Complex randComplex()
Definition: Testing.h:377
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 bool numericallyEqual(float f1, int i2, int n, double tol=defTol< float >())
Definition: Testing.h:218
static Mat33 randMat33()
Definition: Testing.h:396
static Vec< M > randVec()
Definition: Testing.h:382
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 SymMat< N > randSymMat()
Definition: Testing.h:387
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
~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 Mat< M, N > randMat()
Definition: Testing.h:385
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:47
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:610
ELEM max(const VectorBase< ELEM > &v)
Definition: VectorMath.h:251
RowVectorBase< typename CNT< ELEM >::TAbs > abs(const RowVectorBase< ELEM > &v)
Definition: VectorMath.h:120
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:607
Transform_< Real > Transform
Definition: Transform.h:44