void TestSuite::run_case( ITestCaseFactory& test_case_factory, ITestListener& test_listener, TestResult& test_case_result) const { test_case_result.signal_case_execution(); try { auto_ptr<ITestCase> test_case(test_case_factory.create()); test_case->run(test_listener, test_case_result); if (test_case_result.get_assertion_failure_count() > 0) test_case_result.signal_case_failure(); } catch (const ExceptionAssertionFailure&) { test_case_result.signal_case_failure(); } #ifdef NDEBUG catch (const exception& e) { TestListenerHelper::write( test_listener, *this, test_case_factory.get_name(), __FILE__, __LINE__, TestMessage::TestCaseFailure, "an unexpected exception was caught: %s.", e.what()); test_case_result.signal_case_failure(); } catch (...) { TestListenerHelper::write( test_listener, *this, test_case_factory.get_name(), __FILE__, __LINE__, TestMessage::TestCaseFailure, "an unexpected exception was caught (no details available)."); test_case_result.signal_case_failure(); } #endif }
void TestSuite::run_suite( const IFilter& filter, ITestListener& test_listener, TestResult& test_suite_result, TestResult& cumulated_result) const { TestResult local_cumulated_result(cumulated_result); local_cumulated_result.merge(test_suite_result); bool has_begun_suite = false; for (size_t i = 0; i < impl->m_factories.size(); ++i) { ITestCaseFactory* factory = impl->m_factories[i]; // Skip test cases that aren't let through by the filter. if (!filter.accepts(factory->get_name())) continue; if (!has_begun_suite) { // Tell the listener that a test suite is about to be executed. test_listener.begin_suite(*this); test_suite_result.signal_suite_execution(); has_begun_suite = true; } // Instantiate the test case. auto_ptr<ITestCase> test_case(factory->create()); // Tell the listener that a test case is about to be executed. test_listener.begin_case(*this, *test_case.get()); // Run the test case. TestResult test_case_result; run_case( *test_case.get(), test_listener, test_case_result); // Accumulate the test results. test_suite_result.merge(test_case_result); local_cumulated_result.merge(test_case_result); // Tell the listener that the test case execution has ended. test_listener.end_case( *this, *test_case.get(), test_suite_result, test_case_result, local_cumulated_result); } if (has_begun_suite) { // Report a test suite failure if one or more test cases failed. if (test_suite_result.get_case_failure_count() > 0) test_suite_result.signal_suite_failure(); // Tell the listener that the test suite execution has ended. test_listener.end_suite( *this, test_suite_result, cumulated_result); } }