1
0
Fork 0
flightgear/test_suite/fgTestListener.hxx

97 lines
2.4 KiB
C++
Raw Normal View History

TestSuite: Custom output formatting. A large number of improvements have been made by subclassing the CppUnit classes and overriding the base functions, including CompilerOutputter, TestListener, and TextTestRunner. All IO has also been captured by the test runner. The result is that during the test suite run, only the characters '.', 'F', and 'E' are output for a pass, failure and error state. At the end of each test suite category, all failures and errors are reported in full detail, including the different captured IO streams. A final synopsis is printed out, improving the overview in the case of too many tests failing. For the fgCompilerOutputter class, the printSuccess(), printFailureReport(), printFailureDetail(), and printSuiteStats() functions have been replaced to implement the above printout design. The class also stores the std::vector of TestIOCapt structures for the final printouts. The fgTestListener class handles the events from the running of the test suite. The startTest() and endTest() functions are used for IO capture. The IO is placed into a TestIOCapt data structure, with one std::string for holding the combined STDOUT and STDERR IO, and another for the SG_LOG IO. If failures occur, the TestIOCapt structure is appended to the fgCompilerOutputter vector. The startTest() and endTest() functions are also used for starting and stopping a timer to allow the full test suite to be timed. And the addFailure() function simply registers test failures or errors. The fgTestRunner class overrides the CppUnit::TextTestRunner::run() function, simply to prevent the base method from spawning a second test listener, causing the test output to be duplicated. Some auxiliary formatting functions have been added to print out titles, sections, and synopsis summary lines.
2016-02-09 16:34:56 +00:00
/*
* Copyright (C) 2016 Edward d'Auvergne
*
* This file is part of the program FlightGear.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _FG_TEST_LISTENER_HXX
#define _FG_TEST_LISTENER_HXX
#include <time.h>
#include <vector>
// Data structure for holding the captured IO for a failed test.
struct TestIOCapt {
std::string name;
std::string stdio;
std::string sg_bulk;
std::string sg_bulk_only;
std::string sg_debug_only;
std::string sg_info_only;
std::string sg_warn_only;
std::string sg_alert_only;
TestSuite: Custom output formatting. A large number of improvements have been made by subclassing the CppUnit classes and overriding the base functions, including CompilerOutputter, TestListener, and TextTestRunner. All IO has also been captured by the test runner. The result is that during the test suite run, only the characters '.', 'F', and 'E' are output for a pass, failure and error state. At the end of each test suite category, all failures and errors are reported in full detail, including the different captured IO streams. A final synopsis is printed out, improving the overview in the case of too many tests failing. For the fgCompilerOutputter class, the printSuccess(), printFailureReport(), printFailureDetail(), and printSuiteStats() functions have been replaced to implement the above printout design. The class also stores the std::vector of TestIOCapt structures for the final printouts. The fgTestListener class handles the events from the running of the test suite. The startTest() and endTest() functions are used for IO capture. The IO is placed into a TestIOCapt data structure, with one std::string for holding the combined STDOUT and STDERR IO, and another for the SG_LOG IO. If failures occur, the TestIOCapt structure is appended to the fgCompilerOutputter vector. The startTest() and endTest() functions are also used for starting and stopping a timer to allow the full test suite to be timed. And the addFailure() function simply registers test failures or errors. The fgTestRunner class overrides the CppUnit::TextTestRunner::run() function, simply to prevent the base method from spawning a second test listener, causing the test output to be duplicated. Some auxiliary formatting functions have been added to print out titles, sections, and synopsis summary lines.
2016-02-09 16:34:56 +00:00
};
// Match the test by name for std:find using a vector<TestIOCapt>.
class matchTestName
{
std::string _name;
public:
matchTestName(const std::string &name) : _name(name) {}
bool operator()(const TestIOCapt &item) const {
return item.name == _name;
}
};
// The custom test runner for the FlightGear test suite.
class fgTestListener : public CppUnit::TestListener
{
public:
// Constructor.
fgTestListener(): m_failure(false), m_error(false), sum_time(0) { };
// Override the base class function to capture IO. streams
void startTest(CppUnit::Test *test);
// Override the base class function to restore IO streams.
void endTest(CppUnit::Test *test);
// Handle failures.
void addFailure(const CppUnit::TestFailure &failure);
// Test suite timing.
clock_t sum_time;
// IO capture for all failed tests.
std::vector<TestIOCapt> io_capt;
// Output settings.
bool verbose;
protected:
TestSuite: Custom output formatting. A large number of improvements have been made by subclassing the CppUnit classes and overriding the base functions, including CompilerOutputter, TestListener, and TextTestRunner. All IO has also been captured by the test runner. The result is that during the test suite run, only the characters '.', 'F', and 'E' are output for a pass, failure and error state. At the end of each test suite category, all failures and errors are reported in full detail, including the different captured IO streams. A final synopsis is printed out, improving the overview in the case of too many tests failing. For the fgCompilerOutputter class, the printSuccess(), printFailureReport(), printFailureDetail(), and printSuiteStats() functions have been replaced to implement the above printout design. The class also stores the std::vector of TestIOCapt structures for the final printouts. The fgTestListener class handles the events from the running of the test suite. The startTest() and endTest() functions are used for IO capture. The IO is placed into a TestIOCapt data structure, with one std::string for holding the combined STDOUT and STDERR IO, and another for the SG_LOG IO. If failures occur, the TestIOCapt structure is appended to the fgCompilerOutputter vector. The startTest() and endTest() functions are also used for starting and stopping a timer to allow the full test suite to be timed. And the addFailure() function simply registers test failures or errors. The fgTestRunner class overrides the CppUnit::TextTestRunner::run() function, simply to prevent the base method from spawning a second test listener, causing the test output to be duplicated. Some auxiliary formatting functions have been added to print out titles, sections, and synopsis summary lines.
2016-02-09 16:34:56 +00:00
// The original IO streams.
std::streambuf *orig_cerr, *orig_cout;
// Captured IO streams.
std::stringstream capt;
// Test timings.
clock_t m_time;
// Failure state.
bool m_failure, m_error;
};
#endif // _FG_TEST_LISTENER_HXX