diff --git a/test/testsuite.cpp b/test/testsuite.cpp index 9d353b8aa..adc220b89 100644 --- a/test/testsuite.cpp +++ b/test/testsuite.cpp @@ -20,6 +20,7 @@ #include "options.h" #include +#include #include std::ostringstream errout; @@ -73,15 +74,19 @@ TestFixture::TestFixture(const std::string &_name) } -bool TestFixture::runTest(const char testname[]) +bool TestFixture::prepareTest(const char testname[]) { + // Check if tests should be executed if (testToRun.empty() || testToRun == testname) { + // Tests will be executed - prepare them ++countTests; if (quiet_tests) { - std::cout << '.'; + std::putchar('.'); // Use putchar to write through redirection of std::cout/cerr } else { std::cout << classname << "::" << testname << std::endl; } + _lib = Library(); + currentTest = classname + "::" + testname; return true; } return false; @@ -232,7 +237,11 @@ void TestFixture::run(const std::string &str) if (quiet_tests) { std::cout << '\n' << classname << ':'; } - run(); + if (quiet_tests) { + REDIRECT; + run(); + } else + run(); } void TestFixture::warn(const char msg[]) diff --git a/test/testsuite.h b/test/testsuite.h index 6fc71324a..cbc6bdb5a 100644 --- a/test/testsuite.h +++ b/test/testsuite.h @@ -47,7 +47,7 @@ protected: virtual void run() = 0; - bool runTest(const char testname[]); + bool prepareTest(const char testname[]); void assert_(const char *filename, unsigned int linenr, bool condition) const; void todoAssert(const char *filename, unsigned int linenr, bool condition) const; @@ -65,6 +65,7 @@ protected: long long current, long long actual) const; void assertThrowFail(const char *filename, unsigned int linenr) const; void complainMissingLib(const char* libname) const; + void processOptions(const options& args); public: virtual void reportOut(const std::string &outmsg); @@ -78,12 +79,12 @@ public: static std::size_t runTests(const options& args); }; -#define TEST_CASE( NAME ) if ( runTest(#NAME) ) { _lib = Library(); currentTest = classname + "::" + #NAME; if (quiet_tests) { REDIRECT; NAME(); } else { NAME ();} } +#define TEST_CASE( NAME ) if ( prepareTest(#NAME) ) { NAME(); } #define ASSERT( CONDITION ) assert_(__FILE__, __LINE__, CONDITION) #define ASSERT_EQUALS( EXPECTED , ACTUAL ) assertEquals(__FILE__, __LINE__, EXPECTED, ACTUAL) #define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL) #define ASSERT_EQUALS_MSG( EXPECTED , ACTUAL, MSG ) assertEquals(__FILE__, __LINE__, EXPECTED, ACTUAL, MSG) -#define ASSERT_THROW( CMD, EXCEPTION ) try { CMD ; assertThrowFail(__FILE__, __LINE__); } catch (EXCEPTION &) { } catch (...) { assertThrowFail(__FILE__, __LINE__); } +#define ASSERT_THROW( CMD, EXCEPTION ) try { CMD ; assertThrowFail(__FILE__, __LINE__); } catch (const EXCEPTION&) { } catch (...) { assertThrowFail(__FILE__, __LINE__); } #define TODO_ASSERT_EQUALS( WANTED , CURRENT , ACTUAL ) todoAssertEquals(__FILE__, __LINE__, WANTED, CURRENT, ACTUAL) #define REGISTER_TEST( CLASSNAME ) namespace { CLASSNAME instance; }