added cppunit unit testing framework, using cmake, stripped out the original build systems.

added starting point for Bullet unit tests, with one example unit test
Enable the option BUILD_UNIT_TESTS in cmake to build the test. Note that the test doesn't automatically run.
This commit is contained in:
erwin.coumans
2010-07-23 22:09:57 +00:00
parent 6f823687b5
commit a983353f34
139 changed files with 15575 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
#ifndef CPPUNIT_PORTABILITY_CPPUNITDEQUE_H
#define CPPUNIT_PORTABILITY_CPPUNITDEQUE_H
// The technic used is similar to the wrapper of STLPort.
#include <cppunit/Portability.h>
#include <deque>
#if CPPUNIT_STD_NEED_ALLOCATOR
template<class T>
class CppUnitDeque : public std::deque<T,CPPUNIT_STD_ALLOCATOR>
{
public:
};
#else // CPPUNIT_STD_NEED_ALLOCATOR
#define CppUnitDeque std::deque
#endif
#endif // CPPUNIT_PORTABILITY_CPPUNITDEQUE_H

View File

@@ -0,0 +1,29 @@
#ifndef CPPUNIT_PORTABILITY_CPPUNITMAP_H
#define CPPUNIT_PORTABILITY_CPPUNITMAP_H
// The technic used is similar to the wrapper of STLPort.
#include <cppunit/Portability.h>
#include <functional>
#include <map>
#if CPPUNIT_STD_NEED_ALLOCATOR
template<class Key, class T>
class CppUnitMap : public std::map<Key
,T
,std::less<Key>
,CPPUNIT_STD_ALLOCATOR>
{
public:
};
#else // CPPUNIT_STD_NEED_ALLOCATOR
#define CppUnitMap std::map
#endif
#endif // CPPUNIT_PORTABILITY_CPPUNITMAP_H

View File

@@ -0,0 +1,28 @@
#ifndef CPPUNIT_PORTABILITY_CPPUNITSET_H
#define CPPUNIT_PORTABILITY_CPPUNITSET_H
// The technic used is similar to the wrapper of STLPort.
#include <cppunit/Portability.h>
#include <functional>
#include <set>
#if CPPUNIT_STD_NEED_ALLOCATOR
template<class T>
class CppUnitSet : public std::set<T
,std::less<T>
,CPPUNIT_STD_ALLOCATOR>
{
public:
};
#else // CPPUNIT_STD_NEED_ALLOCATOR
#define CppUnitSet std::set
#endif
#endif // CPPUNIT_PORTABILITY_CPPUNITSET_H

View File

@@ -0,0 +1,26 @@
#ifndef CPPUNIT_PORTABILITY_CPPUNITSTACK_H
#define CPPUNIT_PORTABILITY_CPPUNITSTACK_H
// The technic used is similar to the wrapper of STLPort.
#include <cppunit/Portability.h>
#include <deque>
#include <stack>
#if CPPUNIT_STD_NEED_ALLOCATOR
template<class T>
class CppUnitStack : public std::stack<T
,std::deque<T,CPPUNIT_STD_ALLOCATOR> >
{
public:
};
#else // CPPUNIT_STD_NEED_ALLOCATOR
#define CppUnitStack std::stack
#endif
#endif // CPPUNIT_PORTABILITY_CPPUNITSTACK_H

View File

@@ -0,0 +1,25 @@
#ifndef CPPUNIT_PORTABILITY_CPPUNITVECTOR_H
#define CPPUNIT_PORTABILITY_CPPUNITVECTOR_H
// The technic used is similar to the wrapper of STLPort.
#include <cppunit/Portability.h>
#include <vector>
#if CPPUNIT_STD_NEED_ALLOCATOR
template<class T>
class CppUnitVector : public std::vector<T,CPPUNIT_STD_ALLOCATOR>
{
public:
};
#else // CPPUNIT_STD_NEED_ALLOCATOR
#define CppUnitVector std::vector
#endif
#endif // CPPUNIT_PORTABILITY_CPPUNITVECTOR_H

View File

@@ -0,0 +1,54 @@
#ifndef CPPUNIT_PORTABILITY_FLOATINGPOINT_H_INCLUDED
#define CPPUNIT_PORTABILITY_FLOATINGPOINT_H_INCLUDED
#include <cppunit/Portability.h>
#include <math.h>
CPPUNIT_NS_BEGIN
/// \brief Tests if a floating-point is a NaN.
// According to IEEE-754 floating point standard,
// (see e.g. page 8 of
// http://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps)
// all comparisons with NaN are false except "x != x", which is true.
//
// At least Microsoft Visual Studio 6 is known not to implement this test correctly.
// It emits the following code to test equality:
// fcomp qword ptr [nan]
// fnstsw ax // copie fp (floating-point) status register to ax
// test ah,40h // test bit 14 of ax (0x4000) => C3 of fp status register
// According to the following documentation on the x86 floating point status register,
// the C2 bit should be tested to test for NaN value.
// http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117
// In Microsoft Visual Studio 2003 & 2005, the test is implemented with:
// test ah,44h // Visual Studio 2005 test both C2 & C3...
//
// To work around this, a NaN is assumed to be detected if no strict ordering is found.
inline bool floatingPointIsUnordered( double x )
{
// x != x will detect a NaN on conformant platform
// (2.0 < x && x < 1.0) will detect a NaN on non conformant platform:
// => no ordering can be found for x.
return (x != x) || (2.0 < x && x < 1.0);
}
/// \brief Tests if a floating-point is finite.
/// @return \c true if x is neither a NaN, nor +inf, nor -inf, \c false otherwise.
inline int floatingPointIsFinite( double x )
{
#if defined(CPPUNIT_HAVE_ISFINITE)
return isfinite( x );
#elif defined(CPPUNIT_HAVE_FINITE)
return finite( x );
#elif defined(CPPUNIT_HAVE__FINITE)
return _finite(x);
#else
double testInf = x * 0.0; // Produce 0.0 if x is finite, a NaN otherwise.
return testInf == 0.0 && !floatingPointIsUnordered(testInf);
#endif
}
CPPUNIT_NS_END
#endif // CPPUNIT_PORTABILITY_FLOATINGPOINT_H_INCLUDED

View File

@@ -0,0 +1,347 @@
#ifndef CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
#define CPPUNIT_PORTABILITY_STREAM_H_INCLUDED
// This module define:
// Type CppUT::Stream (either std::stream or a custom type)
// Type CppUT::OStringStream (eitjer std::ostringstream, older alternate or a custom type)
// Functions stdCOut() & stdCErr() which returns a reference on cout & cerr stream (or our
// custom stream).
#include <cppunit/Portability.h>
#if defined( CPPUNIT_NO_STREAM )
#include <string>
#include <stdio.h>
#include <string.h>
CPPUNIT_NS_BEGIN
class StreamBuffer
{
public:
virtual ~StreamBuffer() {}
virtual void write( const char *text, unsigned int length ) = 0;
virtual void flush() {}
};
class StringStreamBuffer : public StreamBuffer
{
public:
std::string str() const
{
return str_;
}
public: // overridden from StreamBuffer
void write( const char *text, unsigned int length )
{
str_.append( text, length );
}
private:
std::string str_;
};
class FileStreamBuffer : public StreamBuffer
{
public:
FileStreamBuffer( FILE *file )
: file_( file )
{
}
FILE *file() const
{
return file_;
}
public: // overridden from StreamBuffer
void write( const char *text, unsigned int length )
{
if ( file_ )
fwrite( text, sizeof(char), length, file_ );
}
void flush()
{
if ( file_ )
fflush( file_ );
}
private:
FILE *file_;
};
class OStream
{
public:
OStream()
: buffer_( 0 )
{
}
OStream( StreamBuffer *buffer )
: buffer_( buffer )
{
}
virtual ~OStream()
{
flush();
}
OStream &flush()
{
if ( buffer_ )
buffer_->flush();
return *this;
}
void setBuffer( StreamBuffer *buffer )
{
buffer_ = buffer;
}
OStream &write( const char *text, unsigned int length )
{
if ( buffer_ )
buffer_->write( text, length );
return *this;
}
OStream &write( const char *text )
{
return write( text, strlen(text) );
}
OStream &operator <<( bool v )
{
const char *out = v ? "true" : "false";
return write( out );
}
OStream &operator <<( short v )
{
char buffer[64];
sprintf( buffer, "%hd", v );
return write( buffer );
}
OStream &operator <<( unsigned short v )
{
char buffer[64];
sprintf( buffer, "%hu", v );
return write( buffer );
}
OStream &operator <<( int v )
{
char buffer[64];
sprintf( buffer, "%d", v );
return write( buffer );
}
OStream &operator <<( unsigned int v )
{
char buffer[64];
sprintf( buffer, "%u", v );
return write( buffer );
}
OStream &operator <<( long v )
{
char buffer[64];
sprintf( buffer, "%ld", v );
return write( buffer );
}
OStream &operator <<( unsigned long v )
{
char buffer[64];
sprintf( buffer, "%lu", v );
return write( buffer );
}
OStream &operator <<( float v )
{
char buffer[128];
sprintf( buffer, "%.16g", double(v) );
return write( buffer );
}
OStream &operator <<( double v )
{
char buffer[128];
sprintf( buffer, "%.16g", v );
return write( buffer );
}
OStream &operator <<( long double v )
{
char buffer[128];
sprintf( buffer, "%.16g", double(v) );
return write( buffer );
}
OStream &operator <<( const void *v )
{
char buffer[64];
sprintf( buffer, "%p", v );
return write( buffer );
}
OStream &operator <<( const char *v )
{
return write( v ? v : "NULL" );
}
OStream &operator <<( char c )
{
char buffer[16];
sprintf( buffer, "%c", c );
return write( buffer );
}
OStream &operator <<( const std::string &s )
{
return write( s.c_str(), s.length() );
}
private:
StreamBuffer *buffer_;
};
class OStringStream : public OStream
{
public:
OStringStream()
: OStream( &buffer_ )
{
}
std::string str() const
{
return buffer_.str();
}
private:
StringStreamBuffer buffer_;
};
class OFileStream : public OStream
{
public:
OFileStream( FILE *file )
: OStream( &buffer_ )
, buffer_( file )
, ownFile_( false )
{
}
OFileStream( const char *path )
: OStream( &buffer_ )
, buffer_( fopen( path, "wt" ) )
, ownFile_( true )
{
}
virtual ~OFileStream()
{
if ( ownFile_ && buffer_.file() )
fclose( buffer_.file() );
}
private:
FileStreamBuffer buffer_;
bool ownFile_;
};
inline OStream &stdCOut()
{
static OFileStream stream( stdout );
return stream;
}
inline OStream &stdCErr()
{
static OFileStream stream( stderr );
return stream;
}
CPPUNIT_NS_END
#elif CPPUNIT_HAVE_SSTREAM // #if defined( CPPUNIT_NO_STREAM )
# include <sstream>
# include <fstream>
CPPUNIT_NS_BEGIN
typedef std::ostringstream OStringStream; // The standard C++ way
typedef std::ofstream OFileStream;
CPPUNIT_NS_END
#elif CPPUNIT_HAVE_CLASS_STRSTREAM
# include <string>
# if CPPUNIT_HAVE_STRSTREAM
# include <strstream>
# else // CPPUNIT_HAVE_STRSTREAM
# include <strstream.h>
# endif // CPPUNIT_HAVE_CLASS_STRSTREAM
CPPUNIT_NS_BEGIN
class OStringStream : public std::ostrstream
{
public:
std::string str()
{
// (*this) << '\0';
// std::string msg(std::ostrstream::str());
// std::ostrstream::freeze(false);
// return msg;
// Alternative implementation that don't rely on freeze which is not
// available on some platforms:
return std::string( std::ostrstream::str(), pcount() );
}
};
CPPUNIT_NS_END
#else // CPPUNIT_HAVE_CLASS_STRSTREAM
# error Cannot define CppUnit::OStringStream.
#endif // #if defined( CPPUNIT_NO_STREAM )
#if !defined( CPPUNIT_NO_STREAM )
#include <iostream>
CPPUNIT_NS_BEGIN
typedef std::ostream OStream;
inline OStream &stdCOut()
{
return std::cout;
}
inline OStream &stdCErr()
{
return std::cerr;
}
CPPUNIT_NS_END
#endif // #if !defined( CPPUNIT_NO_STREAM )
#endif // CPPUNIT_PORTABILITY_STREAM_H_INCLUDED