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