Skip to content

Commit

Permalink
TESTS: Add Google Test, Google's C++ test framework
Browse files Browse the repository at this point in the history
  • Loading branch information
DrMcCoy committed Dec 21, 2016
1 parent 218d602 commit ad2a294
Show file tree
Hide file tree
Showing 47 changed files with 32,153 additions and 2 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ Makefile.am.cmake
# git versioning stamp
/src/version/gitstamp

# Unit tests
/test-suite.log

# Unix binary
/src/xoreos

Expand Down
7 changes: 7 additions & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,10 @@ Nintendo DS formats
They are also based on lowlines' file format specifications
(<http://llref.emutalk.net/docs/>) and the Nintendo DS information
documentation GBATEK by Martin Korth (<http://problemkaputt.de/gbatek.htm>).

Google Test
***********
xoreos uses Google Test (<https://github.com/google/googletest>), Google's
C++ test framework. Google Test is licensed under the terms of the 3-clause
BSD license. For the full license text, see tests/googletest/LICENSE or
<https://github.com/google/googletest/blob/master/googletest/LICENSE>.
52 changes: 52 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,15 @@ endif()
include_directories(${GLEW_INCLUDE_DIRS})
list(APPEND XOREOS_LIBRARIES ${GLEW_LIBRARIES})

# pthreads, for our unit tests
if(NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "MinGW")
find_package(Threads)
endif()

set(HAVE_PTHREAD ${CMAKE_USE_PTHREADS_INIT})
if(CMAKE_USE_PTHREADS_INIT)
set(PTHREAD_LIBS ${CMAKE_THREAD_LIBS_INIT})
endif()

# use our own version of lua, as we will have to support the Witcher lua scripts
parse_automake(lua/rules.mk)
Expand All @@ -325,14 +334,57 @@ parse_automake(toluapp/rules.mk)
list(APPEND XOREOS_LIBRARIES toluapp)


# -------------------------------------------------------------------------
# custom unit testing target, because CMake's make test is pretty useless
add_custom_target(check ${CMAKE_COMMAND} -E echo CWD=${CMAKE_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E echo CMD=${CMAKE_CTEST_COMMAND} -C $<CONFIG>
COMMAND ${CMAKE_COMMAND} -E echo ----------------------------------
COMMAND ${CMAKE_COMMAND} -E env CTEST_OUTPUT_ON_FAILURE=1 ${CMAKE_CTEST_COMMAND} -C $<CONFIG>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})


# -------------------------------------------------------------------------
# xoreos main targets, parsed from the Automake rules.mk files
include_directories(${PROJECT_SOURCE_DIR})
add_definitions(-DPACKAGE_STRING="xoreos ${xoreos_VERSION}")

parse_automake(src/rules.mk)

# unit tests depend on xoreos proper
foreach(AM_TARGET ${AM_TARGETS})
add_dependencies(check ${AM_TARGET})
endforeach()

foreach(AM_PROGRAM ${AM_PROGRAMS})
target_link_libraries(${AM_PROGRAM} ${XOREOS_LIBRARIES})
endforeach()


# -------------------------------------------------------------------------
# unit tests, parsed from the Automake rules.mk files
enable_testing()
parse_automake(tests/rules.mk)

# our unit tests depend on this directory structure
foreach(AM_DIRECTORY ${AM_DIRECTORIES})
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${AM_DIRECTORY})
endforeach()

# they should be build on make check, but not make all
foreach(AM_TARGET ${AM_TARGETS})
set_target_properties(${AM_TARGET} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE EXCLUDE_FROM_ALL TRUE)
add_dependencies(check ${AM_TARGET})

# ctest counts skipped tests as failed... -.-
get_target_property(TARGET_SOURCES ${AM_TARGET} SOURCES)
foreach(TARGET_SOURCE ${TARGET_SOURCES})
set_source_files_properties(${TARGET_SOURCE} PROPERTIES APPEND PROPERTY COMPILE_DEFINITIONS "SKIP_RETURN_CODE=0")
endforeach()
endforeach()

foreach(AM_PROGRAM ${AM_PROGRAMS})
target_link_libraries(${AM_PROGRAM} ${XOREOS_LIBRARIES})
add_test(NAME ${AM_PROGRAM} COMMAND ${AM_PROGRAM})
endforeach()


Expand Down
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ EMPTY =

noinst_HEADERS =
noinst_LTLIBRARIES =
check_LTLIBRARIES =

bin_PROGRAMS =

Expand Down
87 changes: 85 additions & 2 deletions cmake/CMakeAM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ endfunction()


function(am_target_name AM_FOLDER AM_FILE_NAME AM_OUTPUT)
if("${AM_FILE_NAME}" MATCHES "^-l")
set(${AM_OUTPUT} ${AM_FILE_NAME} PARENT_SCOPE)
return()
endif()

get_filename_component(AM_FULLPATH "${AM_FILE_NAME}" ABSOLUTE)
get_filename_component(AM_FOLDER "${AM_FULLPATH}" PATH)
get_filename_component(AM_FOLDER "${AM_FOLDER}" NAME)
Expand All @@ -47,6 +52,7 @@ function(am_target_name AM_FOLDER AM_FILE_NAME AM_OUTPUT)

string(REPLACE "/" "_" AM_TARGET_NAME "${AM_TARGET_NAME}")
string(REGEX REPLACE "^src_" "" AM_TARGET_NAME "${AM_TARGET_NAME}")
string(REGEX REPLACE "^tests_tests_" "tests_" AM_TARGET_NAME "${AM_TARGET_NAME}")
set(${AM_OUTPUT} ${AM_TARGET_NAME} PARENT_SCOPE)
endfunction()

Expand Down Expand Up @@ -125,13 +131,74 @@ function(convert_automake_internal AM_INPUT_FILE CMAKE_OUTPUT_FILE)
endforeach()
endfunction()

function(am_find_directories INPUT_PATH OUTPUT_LIST)
if ("${INPUT_PATH}" MATCHES "/")
string(REGEX REPLACE "/[^/]*$" "" INPUT_DIRECTORY "${INPUT_PATH}")
list(APPEND "${OUTPUT_LIST}" "${INPUT_DIRECTORY}")
endif()

set(${OUTPUT_LIST} "${${OUTPUT_LIST}}" PARENT_SCOPE)
endfunction()

# Set target CXXFLAGS, by parsing for special values
function(am_set_flags TARGET FLAGS_LIST)
list(LENGTH FLAGS_LIST FLAGS_COUNT)

set(FLAGS_MISC)
set(FLAGS_DEFINE)
set(FLAGS_INCLUDES)
set(FLAGS_INCLUDES_SYSTEM)

set(i 0)
while(${i} LESS ${FLAGS_COUNT})
list(GET FLAGS_LIST ${i} FLAG)

if("${FLAG}" MATCHES "^-D$")
math(EXPR i "${i} + 1")
list(GET FLAGS_LIST ${i} FLAG)
list(APPEND FLAGS_DEFINE "${FLAG}")
elseif("${FLAG}" MATCHES "^-D")
string(REGEX REPLACE "^-D" "" FLAG "${FLAG}")
list(APPEND FLAGS_DEFINE "${FLAG}")
elseif("${FLAG}" STREQUAL "-isystem")
math(EXPR i "${i} + 1")
list(GET FLAGS_LIST ${i} FLAG)
list(APPEND FLAGS_INCLUDES_SYSTEM "${FLAG}")
elseif("${FLAG}" MATCHES "^-I$")
math(EXPR i "${i} + 1")
list(GET FLAGS_LIST ${i} FLAG)
list(APPEND FLAGS_INCLUDES "${FLAG}")
elseif("${FLAG}" MATCHES "^-I")
string(REGEX REPLACE "^-I" "" FLAG "${FLAG}")
list(APPEND FLAGS_INCLUDES "${FLAG}")
else()
list(APPEND FLAGS_MISC "${FLAG}")
endif()

math(EXPR i "${i} + 1")
endwhile()

string(REPLACE ";" " " FLAGS_MISC "${FLAGS_MISC}")
set_target_properties(${TARGET} PROPERTIES APPEND_STRING PROPERTY COMPILE_FLAGS "${FLAGS_MISC}")

get_target_property(TARGET_SOURCES ${TARGET} SOURCES)
foreach(TARGET_SOURCE ${TARGET_SOURCES})
set_source_files_properties(${TARGET_SOURCE} PROPERTIES APPEND PROPERTY COMPILE_DEFINITIONS "${FLAGS_DEFINE}")
endforeach()

target_include_directories(${TARGET} PUBLIC ${FLAGS_INCLUDES})
target_include_directories(${TARGET} SYSTEM PUBLIC ${FLAGS_INCLUDES_SYSTEM})
endfunction()

# Create the output file, and start the conversion
function(convert_automake AM_INPUT_FILE CMAKE_OUTPUT_FILE)
file(WRITE "${CMAKE_OUTPUT_FILE}" "# Autogenerated file, do not edit!\n")
convert_automake_internal(${AM_INPUT_FILE} ${CMAKE_OUTPUT_FILE})
endfunction()

function(parse_automake AM_FILE_NAME)
set(srcdir ${PROJECT_SOURCE_DIR})

get_filename_component(AM_FOLDER ${AM_FILE_NAME} PATH)
if(NOT EXISTS ${AM_FOLDER})
file(MAKE_DIRECTORY ${AM_FOLDER})
Expand All @@ -144,34 +211,50 @@ function(parse_automake AM_FILE_NAME)
include(${CMAKE_OUTPUT_FILE})

set(AM_TARGETS)
set(AM_DIRECTORIES)

# Search for convenience libraries, creating CMake targets
set(AM_STATIC_LIBRARIES)
foreach(AM_FILE ${noinst_LTLIBRARIES})
foreach(AM_FILE ${noinst_LTLIBRARIES} ${check_LTLIBRARIES})
string(REPLACE "." "_" AM_NAME "${AM_FILE}")
string(REPLACE "/" "_" AM_NAME "${AM_NAME}")
am_add_target(lib ${AM_FOLDER} ${AM_FILE} "${${AM_NAME}_SOURCES}" "${${AM_NAME}_LIBADD}")

am_target_name(${AM_FOLDER} ${AM_FILE} AM_TARGET)
set(${AM_TARGET}_LINK_TARGETS ${${AM_TARGET}_LINK_TARGETS} PARENT_SCOPE)

am_set_flags(${AM_TARGET} "${${AM_NAME}_CXXFLAGS}")

am_find_directories("${AM_FILE}" AM_DIRECTORIES)

list(APPEND AM_TARGETS ${AM_TARGET})
list(APPEND AM_STATIC_LIBRARIES ${AM_TARGET})
endforeach()

# Search for programs, creating CMake targets
set(AM_PROGRAMS)
foreach(AM_FILE ${bin_PROGRAMS})
foreach(AM_FILE ${bin_PROGRAMS} ${check_PROGRAMS})
string(REPLACE "." "_" AM_NAME "${AM_FILE}")
string(REPLACE "/" "_" AM_NAME "${AM_NAME}")
am_add_target(bin ${AM_FOLDER} ${AM_FILE} "${${AM_NAME}_SOURCES}" "${${AM_NAME}_LDADD}")

am_target_name(${AM_FOLDER} ${AM_FILE} AM_TARGET)
set(${AM_TARGET}_LINK_TARGETS ${${AM_TARGET}_LINK_TARGETS} PARENT_SCOPE)

am_set_flags(${AM_TARGET} "${${AM_NAME}_CXXFLAGS}")

am_find_directories(${AM_FILE} AM_DIRECTORIES)

list(APPEND AM_TARGETS ${AM_TARGET})
list(APPEND AM_PROGRAMS ${AM_TARGET})
endforeach()

if(AM_DIRECTORIES)
list(REMOVE_DUPLICATES AM_DIRECTORIES)
endif()

set(AM_TARGETS ${AM_TARGETS} PARENT_SCOPE)
set(AM_STATIC_LIBRARIES ${AM_STATIC_LIBRARIES} PARENT_SCOPE)
set(AM_PROGRAMS ${AM_PROGRAMS} PARENT_SCOPE)
set(AM_DIRECTORIES ${AM_DIRECTORIES} PARENT_SCOPE)
endfunction()
4 changes: 4 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@ BOOST_SCOPE_EXIT
BOOST_ATOMIC
BOOST_LOCALE

dnl pthread
AX_PTHREAD()
AM_CONDITIONAL([HAVE_PTHREAD], [test x"$ax_pthread_ok" = xyes])

dnl Extra flags
case "$target" in
*darwin*)
Expand Down
8 changes: 8 additions & 0 deletions dists/debian/copyright
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,14 @@ Copyright: 2011 pleoNeX
2015 The xoreos Team
License: GPL-3.0+

Files: tests/googletest/src/*.h
tests/googletest/src/*.cc
tests/googletest/include/gtest/*.h
tests/googletest/include/gtest/internal/*.h
tests/googletest/include/gtest/internal/custom/*.h
Copyright: 2003, 2005-2009, 2015 Google Inc.
License: BSD-3-clause


License: GPL-2.0+
This program is free software: you can redistribute it and/or modify
Expand Down
2 changes: 2 additions & 0 deletions rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,5 @@ include lua/rules.mk
include toluapp/rules.mk

include src/rules.mk

include tests/rules.mk
37 changes: 37 additions & 0 deletions tests/googletest/CONTRIBUTORS
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# This file contains a list of people who've made non-trivial
# contribution to the Google C++ Testing Framework project. People
# who commit code to the project are encouraged to add their names
# here. Please keep the list sorted by first names.

Ajay Joshi <jaj@google.com>
Balázs Dán <balazs.dan@gmail.com>
Bharat Mediratta <bharat@menalto.com>
Chandler Carruth <chandlerc@google.com>
Chris Prince <cprince@google.com>
Chris Taylor <taylorc@google.com>
Dan Egnor <egnor@google.com>
Eric Roman <eroman@chromium.org>
Hady Zalek <hady.zalek@gmail.com>
Jeffrey Yasskin <jyasskin@google.com>
Jói Sigurðsson <joi@google.com>
Keir Mierle <mierle@gmail.com>
Keith Ray <keith.ray@gmail.com>
Kenton Varda <kenton@google.com>
Manuel Klimek <klimek@google.com>
Markus Heule <markus.heule@gmail.com>
Mika Raento <mikie@iki.fi>
Miklós Fazekas <mfazekas@szemafor.com>
Pasi Valminen <pasi.valminen@gmail.com>
Patrick Hanna <phanna@google.com>
Patrick Riley <pfr@google.com>
Peter Kaminski <piotrk@google.com>
Preston Jackson <preston.a.jackson@gmail.com>
Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>
Russ Cox <rsc@google.com>
Russ Rufer <russ@pentad.com>
Sean Mcafee <eefacm@gmail.com>
Sigurður Ásgeirsson <siggi@google.com>
Tracy Bialik <tracy@pentad.com>
Vadim Berman <vadimb@google.com>
Vlad Losev <vladl@google.com>
Zhanyong Wan <wan@google.com>
28 changes: 28 additions & 0 deletions tests/googletest/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Copyright 2008, Google Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10 changes: 10 additions & 0 deletions tests/googletest/README.xoreos
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
This is a stripped-down version of Google Test 1.8.0
(<https://github.com/google/googletest>), based on the git
revision 5e7fd50e17b6edf1cadff973d0ec68966cf3265e.
This file will list changes applied to it:

Changes:
========

- Add #define GTEST_DONT_DEFINE_TEST_F to not alias GTEST_TEST_F to
TEST_F, for symmetry with GTEST_DONT_DEFINE_TEST

0 comments on commit ad2a294

Please sign in to comment.