// test.h #ifndef TEST_H #define TEST_H #include <string> #include <iosfwd> using std::string; using std::ostream; // The following have underscores because they are macros // (and it's impolite to usurp other users' functions!). // For consistency, _succeed() also has an underscore. #define _test(cond) do_test(cond, #cond, __FILE__, __LINE__) #define _fail(str) do_fail(str, __FILE__, __LINE__) class Test { public: Test(ostream* osptr = 0); virtual ~Test(){} virtual void run() = 0; long getNumPassed() const; long getNumFailed() const; const ostream* getStream() const; void setStream(ostream* osptr); void _succeed(); long report() const; virtual void reset(); protected: void do_test(bool cond, const string& lbl, const char* fname, long lineno); void do_fail(const string& lbl, const char* fname, long lineno); private: ostream* m_osptr; long m_nPass; long m_nFail; // Disallowed: Test(const Test&); Test& operator=(const Test&); }; inline Test::Test(ostream* osptr) { m_osptr = osptr; m_nPass = m_nFail = 0; } inline long Test::getNumPassed() const { return m_nPass; } inline long Test::getNumFailed() const { return m_nFail; } inline const ostream* Test::getStream() const { return m_osptr; } inline void Test::setStream(ostream* osptr) { m_osptr = osptr; } inline void Test::_succeed() { ++m_nPass; } inline void Test::reset() { m_nPass = m_nFail = 0; }