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:
25
UnitTests/cppunit/include/cppunit/portability/CppUnitDeque.h
Normal file
25
UnitTests/cppunit/include/cppunit/portability/CppUnitDeque.h
Normal 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
|
||||
|
||||
29
UnitTests/cppunit/include/cppunit/portability/CppUnitMap.h
Normal file
29
UnitTests/cppunit/include/cppunit/portability/CppUnitMap.h
Normal 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
|
||||
|
||||
28
UnitTests/cppunit/include/cppunit/portability/CppUnitSet.h
Normal file
28
UnitTests/cppunit/include/cppunit/portability/CppUnitSet.h
Normal 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
|
||||
|
||||
26
UnitTests/cppunit/include/cppunit/portability/CppUnitStack.h
Normal file
26
UnitTests/cppunit/include/cppunit/portability/CppUnitStack.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
347
UnitTests/cppunit/include/cppunit/portability/Stream.h
Normal file
347
UnitTests/cppunit/include/cppunit/portability/Stream.h
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user