e88b6543b0
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.
229 lines
7.2 KiB
CMake
229 lines
7.2 KiB
CMake
# Add each test suite category.
|
|
foreach(test_category
|
|
gui_tests
|
|
simgear_tests
|
|
system_tests
|
|
unit_tests
|
|
)
|
|
add_subdirectory(${test_category})
|
|
endforeach(test_category)
|
|
|
|
# Add all test suite sources and headers.
|
|
set(TESTSUITE_SOURCES
|
|
${TESTSUITE_SOURCES}
|
|
bootstrap.cxx
|
|
fgCompilerOutputter.cxx
|
|
fgTestListener.cxx
|
|
fgTestRunner.cxx
|
|
formatting.cxx
|
|
testSuite.cxx
|
|
)
|
|
set(TESTSUITE_HEADERS
|
|
${TESTSUITE_HEADERS}
|
|
fgCompilerOutputter.hxx
|
|
fgTestListener.hxx
|
|
fgTestRunner.hxx
|
|
formatting.hxx
|
|
)
|
|
|
|
# The test suite output directory.
|
|
set(TESTSUITE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# From here on, this is a modified copy of src/Main/CMakeLists.txt. This is
|
|
# designed to have a minimal diff so that this can be updated together with the
|
|
# main CMakeLists.txt file.
|
|
|
|
# Set up the Main FG file sources and headers (excluding bootstrap.cxx and its main() function).
|
|
if(MSVC)
|
|
set(RESOURCE_FILE ${PROJECT_SOURCE_DIR}/src/Main/flightgear.rc)
|
|
endif(MSVC)
|
|
|
|
set(MAIN_SOURCES
|
|
#${PROJECT_SOURCE_DIR}/src/Main/bootstrap.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_commands.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_init.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_io.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_os_common.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_scene_commands.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_props.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/FGInterpolator.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/globals.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/locale.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/logger.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/main.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/options.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/positioninit.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/screensaver_control.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/subsystemFactory.cxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/util.cxx
|
|
${RESOURCE_FILE}
|
|
${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
|
|
)
|
|
|
|
set(MAIN_HEADERS
|
|
${PROJECT_SOURCE_DIR}/src/Main/AircraftDirVisitorBase.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_commands.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_init.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_io.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/fg_props.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/FGInterpolator.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/globals.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/locale.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/logger.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/main.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/options.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/positioninit.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/screensaver_control.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/subsystemFactory.hxx
|
|
${PROJECT_SOURCE_DIR}/src/Main/util.hxx
|
|
${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
|
|
)
|
|
|
|
# On Windows, make sure fgrcc can be run (it needs third-party libraries)
|
|
if(MSVC)
|
|
if(MSVC_3RDPARTY_ROOT AND MSVC_3RDPARTY_DIR)
|
|
set(CMAKE_MSVCIDE_RUN_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/bin)
|
|
else()
|
|
message(FATAL_ERROR
|
|
"Either MSVC_3RDPARTY_ROOT or MSVC_3RDPARTY_DIR is empty or unset")
|
|
endif()
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
|
|
${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
|
|
COMMAND fgrcc --root=${CMAKE_SOURCE_DIR} --output-cpp-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx --init-func-name=initFlightGearEmbeddedResources --output-header-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx --output-header-identifier=_FG_FLIGHTGEAR_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
|
|
DEPENDS
|
|
fgrcc ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
|
|
)
|
|
|
|
# Get the FG sources and headers to be built into the test suite.
|
|
get_property(FG_SOURCES GLOBAL PROPERTY FG_SOURCES)
|
|
get_property(FG_HEADERS GLOBAL PROPERTY FG_HEADERS)
|
|
|
|
link_directories ( ${Boost_LIBRARY_DIRS} )
|
|
|
|
# Set up the source groups.
|
|
get_property(FG_GROUPS_C GLOBAL PROPERTY FG_GROUPS_C)
|
|
string(REPLACE "@" ";" groups ${FG_GROUPS_C} )
|
|
foreach(g ${groups})
|
|
string(REPLACE "#" ";" g2 ${g})
|
|
list(GET g2 0 name)
|
|
list(REMOVE_AT g2 0)
|
|
source_group("${name}\\Sources" FILES ${g2})
|
|
endforeach()
|
|
|
|
# Set up the header groups.
|
|
get_property(FG_GROUPS_H GLOBAL PROPERTY FG_GROUPS_H)
|
|
string(REPLACE "@" ";" groups ${FG_GROUPS_H} )
|
|
foreach(g ${groups})
|
|
string(REPLACE "#" ";" g2 ${g})
|
|
list(GET g2 0 name)
|
|
list(REMOVE_AT g2 0)
|
|
source_group("${name}\\Headers" FILES ${g2})
|
|
endforeach()
|
|
|
|
source_group("Main\\Headers" FILES ${HEADERS})
|
|
source_group("Main\\Sources" FILES ${SOURCES})
|
|
|
|
# Set up the separate executable for running the test suite.
|
|
add_executable(run_test_suite
|
|
${FG_SOURCES}
|
|
${FG_HEADERS}
|
|
${MAIN_SOURCES}
|
|
${MAIN_HEADERS}
|
|
${TESTSUITE_SOURCES}
|
|
${TESTSUITE_HEADERS}
|
|
)
|
|
set_target_properties(run_test_suite
|
|
PROPERTIES
|
|
RUNTIME_OUTPUT_DIRECTORY "${TESTSUITE_OUTPUT_DIR}"
|
|
)
|
|
add_custom_target(test_suite "${TESTSUITE_OUTPUT_DIR}/run_test_suite"
|
|
DEPENDS run_test_suite
|
|
COMMENT "Running the full FlightGear test-suite.")
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
get_property(FG_LIBS GLOBAL PROPERTY FG_LIBS)
|
|
#message(STATUS "fg libs ${FG_LIBS}")
|
|
#message(STATUS "OSG libs ${OPENSCENEGRAPH_LIBRARIES}")
|
|
#message(STATUS "SG libs ${SIMGEAR_LIBRARIES}")
|
|
|
|
if(RTI_FOUND)
|
|
set(HLA_LIBRARIES ${RTI_LIBRARIES})
|
|
else()
|
|
set(HLA_LIBRARIES "")
|
|
endif()
|
|
|
|
if(GDAL_FOUND)
|
|
set(GDAL_LIBRARIES ${GDAL_LIBRARY})
|
|
else()
|
|
set(GDAL_LIBRARIES "")
|
|
endif()
|
|
|
|
if(ENABLE_JSBSIM)
|
|
# FIXME - remove once JSBSim doesn't expose private headers
|
|
include_directories(${PROJECT_SOURCE_DIR}/src/FDM/JSBSim)
|
|
|
|
target_link_libraries(run_test_suite JSBSim)
|
|
endif()
|
|
|
|
if(ENABLE_IAX)
|
|
target_link_libraries(run_test_suite iaxclient_lib ${OPENAL_LIBRARY})
|
|
endif()
|
|
|
|
if(USE_DBUS)
|
|
target_link_libraries(run_test_suite ${DBUS_LIBRARIES})
|
|
endif()
|
|
|
|
if(FG_HAVE_GPERFTOOLS)
|
|
include_directories(${GooglePerfTools_INCLUDE_DIR})
|
|
target_link_libraries(run_test_suite ${GooglePerfTools_LIBRARIES})
|
|
endif()
|
|
|
|
if(CRASHRPT_FOUND)
|
|
target_link_libraries(run_test_suite ${CRASHRPT_LIBRARY})
|
|
endif()
|
|
|
|
if(X11_FOUND)
|
|
target_link_libraries(run_test_suite ${X11_LIBRARIES})
|
|
endif()
|
|
|
|
target_link_libraries(run_test_suite
|
|
SimGearCore
|
|
SimGearScene
|
|
${CPPUNIT_LIBRARIES}
|
|
${EVENT_INPUT_LIBRARIES}
|
|
${GDAL_LIBRARIES}
|
|
${HLA_LIBRARIES}
|
|
${OPENGL_LIBRARIES}
|
|
${OPENSCENEGRAPH_LIBRARIES}
|
|
${PLATFORM_LIBS}
|
|
${PLIB_LIBRARIES}
|
|
${SQLITE3_LIBRARY}
|
|
${SIMGEAR_LIBRARIES}
|
|
)
|
|
|
|
|
|
if(ENABLE_FLITE)
|
|
if(SYSTEM_HTS_ENGINE)
|
|
target_link_libraries(run_test_suite flite_hts ${HTS_ENGINE_LIBRARIES})
|
|
else()
|
|
target_link_libraries(run_test_suite flite_hts hts_engine)
|
|
endif()
|
|
endif()
|
|
|
|
if(Qt5Core_FOUND)
|
|
target_link_libraries(run_test_suite Qt5::Core Qt5::Widgets fglauncher fgqmlui)
|
|
set_property(TARGET run_test_suite PROPERTY AUTOMOC ON)
|
|
endif()
|
|
|
|
if(USE_AEONWAVE)
|
|
target_link_libraries(run_test_suite ${AAX_LIBRARY})
|
|
endif()
|
|
|
|
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
|
target_link_libraries(run_test_suite execinfo)
|
|
endif()
|