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) 467 #define SimTK_SUBTEST1(testFunction,arg1) \ 470 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1);} while(false) 471 #define SimTK_SUBTEST2(testFunction,arg1,arg2) \ 474 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1,arg2);} while(false) 475 #define SimTK_SUBTEST3(testFunction,arg1,arg2,arg3) \ 478 do {SimTK::Test::Subtest sub(#testFunction); (testFunction)(arg1,arg2,arg3);} while(false) 479 #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); \ 592 #define SimTK_TEST_MUST_THROW_DEBUG(stmt) 595 #define SimTK_TEST_MUST_THROW_EXC_DEBUG(stmt,exc) 599 #define SimTK_TEST_MUST_THROW_DEBUG(stmt) SimTK_TEST_MUST_THROW(stmt) 602 #define SimTK_TEST_MUST_THROW_EXC_DEBUG(stmt,exc) \ 605 SimTK_TEST_MUST_THROW_EXC(stmt,exc) 608 #else // expected throws are suppressed 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) 622 #endif // SimTK_SimTKCOMMON_TESTING_H_ 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
Vec< 2, Vec3 > SpatialVec
Spatial vectors are used for (rotation,translation) quantities and consist of a pair of Vec3 objects...
Definition: MassProperties.h:50
static double defTol2()
Definition: Testing.h:189
static Mat< M, N > randMat()
Definition: Testing.h:385
Subtest(const std::string &name)
Definition: Testing.h:421
static bool numericallyEqual(const negator< conjugate< P > > &v1, const std::complex< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:270
static bool numericallyEqual(const UnitInertia_< P > &G1, const UnitInertia_< P > &G2, int n, double tol=defTol< P >())
Definition: Testing.h:363
This is a small, fixed-size symmetric or Hermitian matrix designed for no-overhead inline computation...
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:621
This is the vector class intended to appear in user code for large, variable size column vectors...
Definition: BigMatrix.h:171
static bool numericallyEqual(const conjugate< P > &v1, const conjugate< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:239
static bool numericallyEqual(int i1, double f2, int n, double tol=defTol< double >())
Definition: Testing.h:224
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
static bool numericallyEqual(double f1, int i2, int n, double tol=defTol< double >())
Definition: Testing.h:226
static Row< N > randRow()
Definition: Testing.h:384
static bool numericallyEqual(const RowVector_< E1 > &v1, const RowVectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:328
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
SimTK::conjugate<R> should be instantiated only for float, double.
Definition: String.h:45
Real getValue() const
Get the next value in the pseudo-random sequence.
static Vec3 randVec3()
Definition: Testing.h:395
static bool numericallyEqual(double v1, double v2, int n, double tol=defTol< double >())
Definition: Testing.h:200
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
The Rotation class is a Mat33 that guarantees that the matrix can be interpreted as a legitimate 3x3 ...
Definition: Quaternion.h:40
bool isSameRotationToWithinAngle(const Rotation_ &R, RealP okPointingAngleErrorRads) const
Return true if "this" Rotation is nearly identical to "R" within a specified pointing angle error...
static bool numericallyEqual(const negator< P > &v1, const negator< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:254
TAsVec & updAsVec()
Definition: SymMat.h:832
static bool numericallyEqual(const std::complex< P > &v1, const negator< conjugate< P > > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:274
conjugate< Real > Conjugate
Definition: Scalar.h:57
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(float v1, double v2, int n, double tol=defTol< float >())
Definition: Testing.h:210
static bool numericallyEqual(const P &v1, const negator< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:258
negator<N>, where N is a number type (real, complex, conjugate), is represented in memory identically...
Definition: String.h:44
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 Matrix_< E1 > &m1, const MatrixView_< E2 > &m2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:345
static Vec< M > randVec()
Definition: Testing.h:382
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
static bool numericallyEqual(unsigned u1, unsigned u2, int n, double tol=0)
Definition: Testing.h:207
static bool numericallyEqual(unsigned i1, float f2, int n, double tol=defTol< float >())
Definition: Testing.h:220
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
const TAsVec & getAsVec() const
Definition: SymMat.h:831
static Complex randComplex()
Definition: Testing.h:377
static double randDouble()
Definition: Testing.h:380
static Vector randVector(int m)
Definition: Testing.h:390
(Advanced) This class is identical to RowVector_ except that it has shallow (reference) copy and assi...
Definition: BigMatrix.h:173
static bool numericallyEqual(const RowVectorView_< E1 > &v1, const RowVector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:331
Rotation_< Real > Rotation
Definition: Rotation.h:47
static SymMat< N > randSymMat()
Definition: Testing.h:387
static bool numericallyEqual(const Matrix_< E1 > &m1, const Matrix_< E2 > &m2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:342
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 bool numericallyEqual(unsigned i1, double f2, int n, double tol=defTol< double >())
Definition: Testing.h:228
This is a fixed-length column vector designed for no-overhead inline computation. ...
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:618
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 negator< P > &v1, const P &v2, int n, double tol=defTol< P >())
Definition: Testing.h:262
static bool numericallyEqual(const RowVector_< E1 > &v1, const RowVector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:325
(Advanced) This class is identical to Matrix_ except that it has shallow (reference) copy and assignm...
Definition: BigMatrix.h:167
static bool numericallyEqual(float f1, int i2, int n, double tol=defTol< float >())
Definition: Testing.h:218
static bool numericallyEqual(const RowVectorView_< E1 > &v1, const RowVectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:318
ELEM max(const VectorBase< ELEM > &v)
Definition: VectorMath.h:251
int ncol() const
Return the number of columns n in the logical shape of this matrix.
Definition: MatrixBase.h:138
static Real randReal()
Definition: Testing.h:373
static bool numericallyEqual(float v1, float v2, int n, double tol=defTol< float >())
Definition: Testing.h:196
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 MatrixView_< E1 > &m1, const Matrix_< E2 > &m2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:348
static bool numericallyEqual(const negator< std::complex< P > > &v1, const conjugate< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:266
static SymMat33 randSymMat33()
Definition: Testing.h:397
This is the matrix class intended to appear in user code for large, variable size matrices...
Definition: BigMatrix.h:168
RowVectorBase< typename CNT< ELEM >::TAbs > abs(const RowVectorBase< ELEM > &v)
Definition: VectorMath.h:120
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
The physical meaning of an inertia is the distribution of a rigid body's mass about a particular poin...
Definition: MassProperties.h:82
const SymMat< 3, P > & asSymMat33() const
Obtain a reference to the underlying symmetric matrix type.
Definition: MassProperties.h:397
This is a fixed-length row vector designed for no-overhead inline computation.
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:619
A UnitInertia matrix is a unit-mass inertia matrix; you can convert it to an Inertia by multiplying i...
Definition: MassProperties.h:81
static Conjugate randConjugate()
Definition: Testing.h:378
static bool numericallyEqual(const Vector_< E1 > &v1, const VectorView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:311
Internal utility class for generating test messages for subtests.
Definition: Testing.h:419
static bool numericallyEqual(const Rotation_< P > &R1, const Rotation_< P > &R2, int n, double tol=defTol< P >())
Definition: Testing.h:352
int size() const
Definition: RowVectorBase.h:237
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 Transform randTransform()
Definition: Testing.h:409
Represents a variable size row vector; much less common than the column vector type Vector_...
Definition: BigMatrix.h:174
int size() const
Definition: VectorBase.h:396
static bool numericallyEqual(int i1, int i2, int n, double tol=0)
Definition: Testing.h:206
~Test()
Definition: Testing.h:173
This file ensures that we have access to the Posix time functions clock_getttime() and nanosleep()...
static bool numericallyEqual(const Inertia_< P > &I1, const Inertia_< P > &I2, int n, double tol=defTol< P >())
Definition: Testing.h:368
static bool numericallyEqual(int i1, float f2, int n, double tol=defTol< float >())
Definition: Testing.h:216
static bool numericallyEqual(const VectorView_< E1 > &v1, const Vector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:314
static bool numericallyEqual(const std::complex< P > &v1, const std::complex< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:234
This class represents a small matrix whose size is known at compile time, containing elements of any ...
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:620
static Mat33 randMat33()
Definition: Testing.h:396
static SpatialVec randSpatialVec()
Definition: Testing.h:398
This is the header which should be included in user programs that would like to make use of all the S...
static Matrix randMatrix(int m, int n)
Definition: Testing.h:392
Includes internal headers providing declarations for the basic SimTK Core classes.
static bool numericallyEqual(const Vector_< E1 > &v1, const Vector_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:308
static double defTol()
Definition: Testing.h:185
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 MatrixView_< E1 > &v1, const MatrixView_< E2 > &v2, int n, double tol=(defTol2< E1, E2 >()))
Definition: Testing.h:335
(Advanced) This class is identical to Vector_ except that it has shallow (reference) copy and assignm...
Definition: BigMatrix.h:170
static bool numericallyEqual(const std::complex< P > &v1, const conjugate< P > &v2, int n, double tol=defTol< P >())
Definition: Testing.h:244
static float randFloat()
Definition: Testing.h:379
static Rotation randRotation()
Definition: Testing.h:405
~Subtest()
Definition: Testing.h:428
static bool numericallyEqual(double f1, unsigned i2, int n, double tol=defTol< double >())
Definition: Testing.h:230
static SpatialMat randSpatialMat()
Definition: Testing.h:401
int nrow() const
Return the number of rows m in the logical shape of this matrix.
Definition: MatrixBase.h:136
Transform_< Real > Transform
Definition: Transform.h:44
static bool numericallyEqual(float f1, unsigned i2, int n, double tol=defTol< float >())
Definition: Testing.h:222