Better CMake organization and unit test cleanups

* created a static library containing most source modules
  to avoid compiling source modules twice in code and unit tests
* moved profile_test to main unit tests executable
* removed image_test and edit_test as not really useful
dev-mp
Piotr Dziwinski 2014-08-12 20:03:56 +02:00
parent 4bdfa0aa4e
commit 74312b0405
16 changed files with 280 additions and 1070 deletions

View File

@ -294,43 +294,6 @@ endif()
# Targets
##
if(TESTS)
# Google Test library
find_path(GTEST_SRC_DIR NAMES src/gtest.cc src/gtest-all.cc PATHS /usr/src PATH_SUFFIXES gtest)
find_path(GTEST_INCLUDE_DIR gtest/gtest.h PATHS /usr/include)
if(NOT(FORCE_BUNDLED_GTEST) AND GTEST_SRC_DIR AND GTEST_INCLUDE_DIR)
message(STATUS "Using system gtest library in ${GTEST_SRC_DIR}")
else()
message(STATUS "Using bundled gtest library")
set(GTEST_SRC_DIR ${colobot_SOURCE_DIR}/lib/gtest)
set(GTEST_INCLUDE_DIR ${colobot_SOURCE_DIR}/lib/gtest/include)
endif()
add_subdirectory(${GTEST_SRC_DIR} lib/gtest)
# Google Mock library
find_path(GMOCK_SRC_DIR NAMES src/gmock.cc src/gmock-all.cc PATHS /usr/src PATH_SUFFIXES gmock)
find_path(GMOCK_INCLUDE_DIR gmock/gmock.h PATHS /usr/include)
if(NOT(FORCE_BUNDLED_GMOCK) AND GMOCK_SRC_DIR AND GMOCK_INCLUDE_DIR)
message(STATUS "Using system gmock library in ${GMOCK_SRC_DIR}")
include_directories(${GMOCK_SRC_DIR})
# gmock-all.cc includes all other sources
add_library(gmock STATIC ${GMOCK_SRC_DIR}/src/gmock-all.cc)
else()
message(STATUS "Using bundled gmock library")
set(GMOCK_SRC_DIR ${colobot_SOURCE_DIR}/lib/gmock)
set(GMOCK_INCLUDE_DIR ${colobot_SOURCE_DIR}/lib/gmock/include)
add_subdirectory(${GMOCK_SRC_DIR} lib/gmock)
endif()
# Tests targets
enable_testing()
add_subdirectory(test)
endif()
# Installation paths defined before compiling sources
if(PLATFORM_WINDOWS)
if(MXE)
@ -370,6 +333,43 @@ if(DESKTOP)
add_subdirectory(desktop)
endif()
if(TESTS)
# Google Test library
find_path(GTEST_SRC_DIR NAMES src/gtest.cc src/gtest-all.cc PATHS /usr/src PATH_SUFFIXES gtest)
find_path(GTEST_INCLUDE_DIR gtest/gtest.h PATHS /usr/include)
if(NOT(FORCE_BUNDLED_GTEST) AND GTEST_SRC_DIR AND GTEST_INCLUDE_DIR)
message(STATUS "Using system gtest library in ${GTEST_SRC_DIR}")
else()
message(STATUS "Using bundled gtest library")
set(GTEST_SRC_DIR ${colobot_SOURCE_DIR}/lib/gtest)
set(GTEST_INCLUDE_DIR ${colobot_SOURCE_DIR}/lib/gtest/include)
endif()
add_subdirectory(${GTEST_SRC_DIR} lib/gtest)
# Google Mock library
find_path(GMOCK_SRC_DIR NAMES src/gmock.cc src/gmock-all.cc PATHS /usr/src PATH_SUFFIXES gmock)
find_path(GMOCK_INCLUDE_DIR gmock/gmock.h PATHS /usr/include)
if(NOT(FORCE_BUNDLED_GMOCK) AND GMOCK_SRC_DIR AND GMOCK_INCLUDE_DIR)
message(STATUS "Using system gmock library in ${GMOCK_SRC_DIR}")
include_directories(${GMOCK_SRC_DIR})
# gmock-all.cc includes all other sources
add_library(gmock STATIC ${GMOCK_SRC_DIR}/src/gmock-all.cc)
else()
message(STATUS "Using bundled gmock library")
set(GMOCK_SRC_DIR ${colobot_SOURCE_DIR}/lib/gmock)
set(GMOCK_INCLUDE_DIR ${colobot_SOURCE_DIR}/lib/gmock/include)
add_subdirectory(${GMOCK_SRC_DIR} lib/gmock)
endif()
# Tests targets
enable_testing()
add_subdirectory(test)
endif()
##
# Installation

View File

@ -59,178 +59,197 @@ if(PLATFORM_WINDOWS)
endif()
# Source files
set(SOURCES
app/app.cpp
app/gamedata.cpp
app/main.cpp
app/pausemanager.cpp
app/system.cpp
app/${SYSTEM_CPP_MODULE}
app/system_other.cpp
common/event.cpp
common/image.cpp
common/iman.cpp
common/logger.cpp
common/misc.cpp
common/profile.cpp
common/restext.cpp
common/stringutils.cpp
graphics/core/color.cpp
graphics/engine/camera.cpp
graphics/engine/cloud.cpp
graphics/engine/engine.cpp
graphics/engine/lightman.cpp
graphics/engine/lightning.cpp
graphics/engine/modelfile.cpp
graphics/engine/modelmanager.cpp
graphics/engine/particle.cpp
graphics/engine/planet.cpp
graphics/engine/pyro.cpp
graphics/engine/terrain.cpp
graphics/engine/text.cpp
graphics/engine/water.cpp
graphics/opengl/gldevice.cpp
object/auto/auto.cpp
object/auto/autobase.cpp
object/auto/autoconvert.cpp
object/auto/autoderrick.cpp
object/auto/autodestroyer.cpp
object/auto/autoegg.cpp
object/auto/autoenergy.cpp
object/auto/autofactory.cpp
object/auto/autoflag.cpp
object/auto/autohuston.cpp
object/auto/autoinfo.cpp
object/auto/autojostle.cpp
object/auto/autokid.cpp
object/auto/autolabo.cpp
object/auto/automush.cpp
object/auto/autonest.cpp
object/auto/autonuclear.cpp
object/auto/autopara.cpp
object/auto/autoportico.cpp
object/auto/autoradar.cpp
object/auto/autorepair.cpp
object/auto/autoresearch.cpp
object/auto/autoroot.cpp
object/auto/autosafe.cpp
object/auto/autostation.cpp
object/auto/autotower.cpp
object/brain.cpp
object/mainmovie.cpp
object/motion/motion.cpp
object/motion/motionant.cpp
object/motion/motionbee.cpp
object/motion/motiondummy.cpp
object/motion/motionhuman.cpp
object/motion/motionmother.cpp
object/motion/motionspider.cpp
object/motion/motiontoto.cpp
object/motion/motionvehicle.cpp
object/motion/motionworm.cpp
object/object.cpp
object/robotmain.cpp
object/objman.cpp
object/task/task.cpp
object/task/taskadvance.cpp
object/task/taskbuild.cpp
object/task/taskfire.cpp
object/task/taskfireant.cpp
object/task/taskflag.cpp
object/task/taskgoto.cpp
object/task/taskgungoal.cpp
object/task/taskinfo.cpp
object/task/taskmanager.cpp
object/task/taskmanip.cpp
object/task/taskpen.cpp
object/task/taskrecover.cpp
object/task/taskreset.cpp
object/task/tasksearch.cpp
object/task/taskshield.cpp
object/task/taskspiderexplo.cpp
object/task/tasktake.cpp
object/task/taskterraform.cpp
object/task/taskturn.cpp
object/task/taskwait.cpp
physics/physics.cpp
script/cbottoken.cpp
script/cmdtoken.cpp
script/script.cpp
sound/sound.cpp
ui/button.cpp
ui/check.cpp
ui/color.cpp
ui/compass.cpp
ui/control.cpp
ui/displayinfo.cpp
ui/displaytext.cpp
ui/edit.cpp
ui/editvalue.cpp
ui/gauge.cpp
ui/group.cpp
ui/image.cpp
ui/interface.cpp
ui/key.cpp
ui/label.cpp
ui/list.cpp
ui/maindialog.cpp
ui/mainmap.cpp
ui/mainshort.cpp
ui/map.cpp
ui/scroll.cpp
ui/shortcut.cpp
ui/slider.cpp
ui/studio.cpp
ui/target.cpp
ui/window.cpp
${OPENAL_SRC}
${RES_FILES}
set(BASE_SOURCES
app/app.cpp
app/gamedata.cpp
app/pausemanager.cpp
app/system.cpp
app/${SYSTEM_CPP_MODULE}
app/system_other.cpp
common/event.cpp
common/image.cpp
common/iman.cpp
common/logger.cpp
common/misc.cpp
common/profile.cpp
common/restext.cpp
common/stringutils.cpp
graphics/core/color.cpp
graphics/engine/camera.cpp
graphics/engine/cloud.cpp
graphics/engine/engine.cpp
graphics/engine/lightman.cpp
graphics/engine/lightning.cpp
graphics/engine/modelfile.cpp
graphics/engine/modelmanager.cpp
graphics/engine/particle.cpp
graphics/engine/planet.cpp
graphics/engine/pyro.cpp
graphics/engine/terrain.cpp
graphics/engine/text.cpp
graphics/engine/water.cpp
graphics/opengl/gldevice.cpp
object/auto/auto.cpp
object/auto/autobase.cpp
object/auto/autoconvert.cpp
object/auto/autoderrick.cpp
object/auto/autodestroyer.cpp
object/auto/autoegg.cpp
object/auto/autoenergy.cpp
object/auto/autofactory.cpp
object/auto/autoflag.cpp
object/auto/autohuston.cpp
object/auto/autoinfo.cpp
object/auto/autojostle.cpp
object/auto/autokid.cpp
object/auto/autolabo.cpp
object/auto/automush.cpp
object/auto/autonest.cpp
object/auto/autonuclear.cpp
object/auto/autopara.cpp
object/auto/autoportico.cpp
object/auto/autoradar.cpp
object/auto/autorepair.cpp
object/auto/autoresearch.cpp
object/auto/autoroot.cpp
object/auto/autosafe.cpp
object/auto/autostation.cpp
object/auto/autotower.cpp
object/brain.cpp
object/mainmovie.cpp
object/motion/motion.cpp
object/motion/motionant.cpp
object/motion/motionbee.cpp
object/motion/motiondummy.cpp
object/motion/motionhuman.cpp
object/motion/motionmother.cpp
object/motion/motionspider.cpp
object/motion/motiontoto.cpp
object/motion/motionvehicle.cpp
object/motion/motionworm.cpp
object/object.cpp
object/robotmain.cpp
object/objman.cpp
object/task/task.cpp
object/task/taskadvance.cpp
object/task/taskbuild.cpp
object/task/taskfire.cpp
object/task/taskfireant.cpp
object/task/taskflag.cpp
object/task/taskgoto.cpp
object/task/taskgungoal.cpp
object/task/taskinfo.cpp
object/task/taskmanager.cpp
object/task/taskmanip.cpp
object/task/taskpen.cpp
object/task/taskrecover.cpp
object/task/taskreset.cpp
object/task/tasksearch.cpp
object/task/taskshield.cpp
object/task/taskspiderexplo.cpp
object/task/tasktake.cpp
object/task/taskterraform.cpp
object/task/taskturn.cpp
object/task/taskwait.cpp
physics/physics.cpp
script/cbottoken.cpp
script/cmdtoken.cpp
script/script.cpp
sound/sound.cpp
ui/button.cpp
ui/check.cpp
ui/color.cpp
ui/compass.cpp
ui/control.cpp
ui/displayinfo.cpp
ui/displaytext.cpp
ui/edit.cpp
ui/editvalue.cpp
ui/gauge.cpp
ui/group.cpp
ui/image.cpp
ui/interface.cpp
ui/key.cpp
ui/label.cpp
ui/list.cpp
ui/maindialog.cpp
ui/mainmap.cpp
ui/mainshort.cpp
ui/map.cpp
ui/scroll.cpp
ui/shortcut.cpp
ui/slider.cpp
ui/studio.cpp
ui/target.cpp
ui/window.cpp
${OPENAL_SRC}
${RES_FILES}
)
set(MAIN_SOURCES
app/main.cpp
)
# Libraries
set(LIBS
CBot
clipboard
localename
${SDL_LIBRARY}
${SDLIMAGE_LIBRARY}
${SDLTTF_LIBRARY}
${OPENGL_LIBRARY}
${PNG_LIBRARIES}
${GLEW_LIBRARY}
${Boost_LIBRARIES}
${LIBSNDFILE_LIBRARY}
${OPTIONAL_LIBS}
${PLATFORM_LIBS}
CBot
clipboard
localename
${SDL_LIBRARY}
${SDLIMAGE_LIBRARY}
${SDLTTF_LIBRARY}
${OPENGL_LIBRARY}
${PNG_LIBRARIES}
${GLEW_LIBRARY}
${Boost_LIBRARIES}
${LIBSNDFILE_LIBRARY}
${OPTIONAL_LIBS}
${PLATFORM_LIBS}
)
# Local
include_directories(
.
..
${CMAKE_CURRENT_BINARY_DIR}
set(COLOBOT_LIBS ${LIBS} PARENT_SCOPE)
# Includes
set(LOCAL_INCLUDES
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/..
${CMAKE_CURRENT_BINARY_DIR}
)
# System
include_directories(
SYSTEM
${SDL_INCLUDE_DIR}
${SDLIMAGE_INCLUDE_DIR}
${SDLTTF_INCLUDE_DIR}
${PNG_INCLUDE_DIRS}
${GLEW_INCLUDE_PATH}
${Boost_INCLUDE_DIRS}
${LIBSNDFILE_INCLUDE_DIR}
${LOCALENAME_INCLUDE_DIR}
${OPTIONAL_INCLUDE_DIRS}
${CLIPBOARD_INCLUDE_DIR}
set(SYSTEM_INCLUDES
${SDL_INCLUDE_DIR}
${SDLIMAGE_INCLUDE_DIR}
${SDLTTF_INCLUDE_DIR}
${PNG_INCLUDE_DIRS}
${GLEW_INCLUDE_PATH}
${Boost_INCLUDE_DIRS}
${LIBSNDFILE_INCLUDE_DIR}
${LOCALENAME_INCLUDE_DIR}
${OPTIONAL_INCLUDE_DIRS}
${CLIPBOARD_INCLUDE_DIR}
)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/CBot)
set(COLOBOT_LOCAL_INCLUDES ${LOCAL_INCLUDES} PARENT_SCOPE)
set(COLOBOT_SYSTEM_INCLUDES ${SYSTEM_INCLUDES} PARENT_SCOPE)
add_executable(colobot ${SOURCES})
include_directories(${LOCAL_INCLUDES})
include_directories(SYSTEM ${SYSTEM_INCLUDES})
target_link_libraries(colobot ${LIBS})
# Link directories
link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/CBot
)
# Targets
add_library(colobotbase STATIC ${BASE_SOURCES})
add_executable(colobot ${MAIN_SOURCES})
target_link_libraries(colobot colobotbase ${LIBS})
install(TARGETS colobot RUNTIME DESTINATION ${COLOBOT_INSTALL_BIN_DIR})
if(NOT CBOT_STATIC)

View File

@ -31,8 +31,9 @@ template<> CProfile* CSingleton<CProfile>::m_instance = nullptr;
namespace bp = boost::property_tree;
CProfile::CProfile() :
m_profileNeedSave(false)
CProfile::CProfile()
: m_profileNeedSave(false)
, m_useLocalDirectory(false)
{
}
@ -42,16 +43,21 @@ CProfile::~CProfile()
SaveCurrentDirectory();
}
void CProfile::SetUseLocalDirectory(bool useLocalDirectory)
{
m_useLocalDirectory = useLocalDirectory;
}
std::string CProfile::GetIniFileLocation()
{
return m_useLocalDirectory ? "colobot.ini" : GetSystemUtils()->GetProfileFileLocation();
}
bool CProfile::InitCurrentDirectory()
{
try
{
#if DEV_BUILD
bp::ini_parser::read_ini("colobot.ini", m_propertyTree);
#else
bp::ini_parser::read_ini(GetSystemUtils()->GetProfileFileLocation(), m_propertyTree);
#endif
bp::ini_parser::read_ini(GetIniFileLocation(), m_propertyTree);
}
catch (std::exception & e)
{
@ -67,11 +73,7 @@ bool CProfile::SaveCurrentDirectory()
{
try
{
#if DEV_BUILD
bp::ini_parser::write_ini("colobot.ini", m_propertyTree);
#else
bp::ini_parser::write_ini(GetSystemUtils()->GetProfileFileLocation(), m_propertyTree);
#endif
bp::ini_parser::write_ini(GetIniFileLocation(), m_propertyTree);
}
catch (std::exception & e)
{

View File

@ -45,6 +45,9 @@ public:
CProfile();
virtual ~CProfile();
/** Set flag to force using ini file from local directory */
void SetUseLocalDirectory(bool useLocalDirectory);
/** Loads colobot.ini from current directory
* \return return true on success
*/
@ -129,10 +132,14 @@ public:
*/
bool CopyFileToTemp(std::string filename);
private:
std::string GetIniFileLocation();
private:
boost::property_tree::ptree m_propertyTree;
bool m_profileNeedSave;
std::string m_userDirectory;
bool m_useLocalDirectory;
};
//! Global function to get profile instance

View File

@ -1,170 +1,3 @@
set(SRC_DIR ${colobot_SOURCE_DIR}/src)
# Additional libraries per platform
if(MXE) # MXE requires special treatment
set(PLATFORM_LIBS ${MXE_LIBS})
elseif(PLATFORM_WINDOWS)
# because it isn't included in standard linking libraries
set(PLATFORM_LIBS "-lintl")
elseif(PLATFORM_GNU)
set(PLATFORM_LIBS "-lX11")
elseif(PLATFORM_LINUX)
# for clock_gettime
set(PLATFORM_LIBS "-lrt -lX11")
elseif(PLATFORM_MACOSX)
find_library(LIBINTL_LIBRARY NAMES intl libintl )
set(PLATFORM_LIBS ${LIBINTL_LIBRARY} ${X11_X11_LIB})
endif()
# Configure file
configure_file(${SRC_DIR}/common/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/common/config.h)
# Code sources
set(COLOBOT_SOURCES
${SRC_DIR}/app/app.cpp
${SRC_DIR}/app/gamedata.cpp
${SRC_DIR}/app/pausemanager.cpp
${SRC_DIR}/app/system.cpp
${SRC_DIR}/app/${SYSTEM_CPP_MODULE}
${SRC_DIR}/app/system_other.cpp
${SRC_DIR}/common/event.cpp
${SRC_DIR}/common/image.cpp
${SRC_DIR}/common/iman.cpp
${SRC_DIR}/common/logger.cpp
${SRC_DIR}/common/misc.cpp
${SRC_DIR}/common/profile.cpp
${SRC_DIR}/common/restext.cpp
${SRC_DIR}/common/stringutils.cpp
${SRC_DIR}/graphics/core/color.cpp
${SRC_DIR}/graphics/engine/camera.cpp
${SRC_DIR}/graphics/engine/cloud.cpp
${SRC_DIR}/graphics/engine/engine.cpp
${SRC_DIR}/graphics/engine/lightman.cpp
${SRC_DIR}/graphics/engine/lightning.cpp
${SRC_DIR}/graphics/engine/modelfile.cpp
${SRC_DIR}/graphics/engine/modelmanager.cpp
${SRC_DIR}/graphics/engine/particle.cpp
${SRC_DIR}/graphics/engine/planet.cpp
${SRC_DIR}/graphics/engine/pyro.cpp
${SRC_DIR}/graphics/engine/terrain.cpp
${SRC_DIR}/graphics/engine/text.cpp
${SRC_DIR}/graphics/engine/water.cpp
${SRC_DIR}/graphics/opengl/gldevice.cpp
${SRC_DIR}/object/auto/auto.cpp
${SRC_DIR}/object/auto/autobase.cpp
${SRC_DIR}/object/auto/autoconvert.cpp
${SRC_DIR}/object/auto/autoderrick.cpp
${SRC_DIR}/object/auto/autodestroyer.cpp
${SRC_DIR}/object/auto/autoegg.cpp
${SRC_DIR}/object/auto/autoenergy.cpp
${SRC_DIR}/object/auto/autofactory.cpp
${SRC_DIR}/object/auto/autoflag.cpp
${SRC_DIR}/object/auto/autohuston.cpp
${SRC_DIR}/object/auto/autoinfo.cpp
${SRC_DIR}/object/auto/autojostle.cpp
${SRC_DIR}/object/auto/autokid.cpp
${SRC_DIR}/object/auto/autolabo.cpp
${SRC_DIR}/object/auto/automush.cpp
${SRC_DIR}/object/auto/autonest.cpp
${SRC_DIR}/object/auto/autonuclear.cpp
${SRC_DIR}/object/auto/autopara.cpp
${SRC_DIR}/object/auto/autoportico.cpp
${SRC_DIR}/object/auto/autoradar.cpp
${SRC_DIR}/object/auto/autorepair.cpp
${SRC_DIR}/object/auto/autoresearch.cpp
${SRC_DIR}/object/auto/autoroot.cpp
${SRC_DIR}/object/auto/autosafe.cpp
${SRC_DIR}/object/auto/autostation.cpp
${SRC_DIR}/object/auto/autotower.cpp
${SRC_DIR}/object/brain.cpp
${SRC_DIR}/object/mainmovie.cpp
${SRC_DIR}/object/motion/motion.cpp
${SRC_DIR}/object/motion/motionant.cpp
${SRC_DIR}/object/motion/motionbee.cpp
${SRC_DIR}/object/motion/motionhuman.cpp
${SRC_DIR}/object/motion/motionmother.cpp
${SRC_DIR}/object/motion/motionspider.cpp
${SRC_DIR}/object/motion/motiontoto.cpp
${SRC_DIR}/object/motion/motionvehicle.cpp
${SRC_DIR}/object/motion/motionworm.cpp
${SRC_DIR}/object/motion/motiondummy.cpp
${SRC_DIR}/object/object.cpp
${SRC_DIR}/object/objman.cpp
${SRC_DIR}/object/robotmain.cpp
${SRC_DIR}/object/task/task.cpp
${SRC_DIR}/object/task/taskadvance.cpp
${SRC_DIR}/object/task/taskbuild.cpp
${SRC_DIR}/object/task/taskfire.cpp
${SRC_DIR}/object/task/taskfireant.cpp
${SRC_DIR}/object/task/taskflag.cpp
${SRC_DIR}/object/task/taskgoto.cpp
${SRC_DIR}/object/task/taskgungoal.cpp
${SRC_DIR}/object/task/taskinfo.cpp
${SRC_DIR}/object/task/taskmanager.cpp
${SRC_DIR}/object/task/taskmanip.cpp
${SRC_DIR}/object/task/taskpen.cpp
${SRC_DIR}/object/task/taskrecover.cpp
${SRC_DIR}/object/task/taskreset.cpp
${SRC_DIR}/object/task/tasksearch.cpp
${SRC_DIR}/object/task/taskshield.cpp
${SRC_DIR}/object/task/taskspiderexplo.cpp
${SRC_DIR}/object/task/tasktake.cpp
${SRC_DIR}/object/task/taskterraform.cpp
${SRC_DIR}/object/task/taskturn.cpp
${SRC_DIR}/object/task/taskwait.cpp
${SRC_DIR}/physics/physics.cpp
${SRC_DIR}/script/cbottoken.cpp
${SRC_DIR}/script/cmdtoken.cpp
${SRC_DIR}/script/script.cpp
${SRC_DIR}/sound/sound.cpp
${SRC_DIR}/ui/button.cpp
${SRC_DIR}/ui/check.cpp
${SRC_DIR}/ui/color.cpp
${SRC_DIR}/ui/compass.cpp
${SRC_DIR}/ui/control.cpp
${SRC_DIR}/ui/displayinfo.cpp
${SRC_DIR}/ui/displaytext.cpp
${SRC_DIR}/ui/edit.cpp
${SRC_DIR}/ui/editvalue.cpp
${SRC_DIR}/ui/gauge.cpp
${SRC_DIR}/ui/group.cpp
${SRC_DIR}/ui/image.cpp
${SRC_DIR}/ui/interface.cpp
${SRC_DIR}/ui/key.cpp
${SRC_DIR}/ui/label.cpp
${SRC_DIR}/ui/list.cpp
${SRC_DIR}/ui/maindialog.cpp
${SRC_DIR}/ui/mainmap.cpp
${SRC_DIR}/ui/mainshort.cpp
${SRC_DIR}/ui/map.cpp
${SRC_DIR}/ui/scroll.cpp
${SRC_DIR}/ui/shortcut.cpp
${SRC_DIR}/ui/slider.cpp
${SRC_DIR}/ui/studio.cpp
${SRC_DIR}/ui/target.cpp
${SRC_DIR}/ui/window.cpp
)
set(OPENAL_SOURCES "")
if(OPENAL_SOUND)
set(OPENAL_SOURCES
${SRC_DIR}/sound/oalsound/alsound.cpp
${SRC_DIR}/sound/oalsound/buffer.cpp
${SRC_DIR}/sound/oalsound/channel.cpp
)
endif()
# Optional libraries
set(OPTIONAL_LIBS "")
if(OPENAL_SOUND)
set(OPTIONAL_LIBS ${OPENAL_LIBRARY})
set(OPTIONAL_INCLUDES ${OPENAL_INCLUDE_DIR})
endif()
# Platform-dependent tests
if(PLATFORM_WINDOWS)
set(PLATFORM_TESTS app/system_windows_test.cpp)
@ -172,67 +5,58 @@ elseif(PLATFORM_LINUX)
set(PLATFORM_TESTS app/system_linux_test.cpp)
endif()
# Tests
# Sources
set(UT_SOURCES
main.cpp
app/app_test.cpp
graphics/engine/lightman_test.cpp
math/func_test.cpp
math/geometry_test.cpp
math/matrix_test.cpp
math/vector_test.cpp
${PLATFORM_TESTS}
main.cpp
app/app_test.cpp
common/profile_test.cpp
graphics/engine/lightman_test.cpp
math/func_test.cpp
math/geometry_test.cpp
math/matrix_test.cpp
math/vector_test.cpp
${PLATFORM_TESTS}
)
# Local
# Includes
include_directories(
.
common
math
${SRC_DIR}
${CMAKE_CURRENT_BINARY_DIR}
common
math
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${COLOBOT_LOCAL_INCLUDES}
)
# System
include_directories(
SYSTEM
${GTEST_INCLUDE_DIR}
${GMOCK_INCLUDE_DIR}
${SDL_INCLUDE_DIR}
${SDLIMAGE_INCLUDE_DIR}
${SDLTTF_INCLUDE_DIR}
${PNG_INCLUDE_DIRS}
${GLEW_INCLUDE_PATH}
${Boost_INCLUDE_DIRS}
${OPTIONAL_INCLUDE_DIRS}
${LIBSNDFILE_INCLUDE_DIR}
${CLIPBOARD_INCLUDE_DIR}
${LOCALENAME_INCLUDE_DIR}
SYSTEM
${GTEST_INCLUDE_DIR}
${GMOCK_INCLUDE_DIR}
${COLOBOT_SYSTEM_INCLUDES}
)
# Libraries
set(LIBS
gtest
gmock
CBot
clipboard
localename
${SDL_LIBRARY}
${SDLIMAGE_LIBRARY}
${SDLTTF_LIBRARY}
${OPENGL_LIBRARY}
${PNG_LIBRARIES}
${GLEW_LIBRARY}
${Boost_LIBRARIES}
${OPTIONAL_LIBS}
${PLATFORM_LIBS}
${LIBSNDFILE_LIBRARY}
gtest
gmock
colobotbase
${COLOBOT_LIBS}
)
add_executable(colobot_ut ${COLOBOT_SOURCES} ${UT_SOURCES} ${OPENAL_SOURCES})
# Test files
set(TEST_FILES
common/colobot.ini
)
file(COPY ${TEST_FILES} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
# Targets
add_executable(colobot_ut ${UT_SOURCES})
target_link_libraries(colobot_ut ${LIBS})
add_test(colobot_ut ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/colobot_ut)
# TODO: change the unit cases to independent automated tests to be included in colobot_ut
add_subdirectory(common)
add_subdirectory(ui)
add_test(
NAME colobot_ut
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/colobot_ut
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
)

View File

@ -1,21 +0,0 @@
set(SRC_DIR ${colobot_SOURCE_DIR}/src)
include_directories(
${SRC_DIR}
${GTEST_INCLUDE_DIR}
)
add_executable(image_test ${SRC_DIR}/common/image.cpp image_test.cpp)
target_link_libraries(image_test ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${PNG_LIBRARIES})
add_test(NAME image_test
COMMAND ${CMAKE_BINARY_DIR}/image_test ${CMAKE_SOURCE_DIR}/test/envs/opengl/tex1.png ${CMAKE_BINARY_DIR}/tex1_test.png)
file(COPY colobot.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
add_executable(profile_test ${SRC_DIR}/common/profile.cpp ${SRC_DIR}/common/logger.cpp profile_test.cpp)
set_target_properties(profile_test PROPERTIES COMPILE_DEFINITIONS "DEV_BUILD=1")
target_link_libraries(profile_test gtest ${Boost_LIBRARIES})
add_test(NAME profile_test
COMMAND ${CMAKE_BINARY_DIR}/profile_test
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

View File

@ -1,57 +0,0 @@
#include "common/image.h"
#include <SDL.h>
#include <stdio.h>
/* For now, just a simple test: loading a file from image
* and saving it to another in PNG. */
int main(int argc, char *argv[])
{
if (argc != 3)
{
printf("Usage: %s in_image out_image\n", argv[0]);
return 0;
}
CImage image;
if (! image.Load(argv[1]))
{
std::string err = image.GetError();
printf("Error loading '%s': %s\n", argv[1], err.c_str());
return 1;
}
Gfx::Color color;
std::string str;
color = image.GetPixel(Math::IntPoint(0, 0));
str = color.ToString();
printf("pixel @ (0,0): %s\n", str.c_str());
color = image.GetPixel(Math::IntPoint(0, 1));
str = color.ToString();
printf("pixel @ (0,1): %s\n", str.c_str());
color = image.GetPixel(Math::IntPoint(1, 0));
str = color.ToString();
printf("pixel @ (1,0): %s\n", str.c_str());
color = image.GetPixel(Math::IntPoint(1, 1));
str = color.ToString();
printf("pixel @ (1,1): %s\n", str.c_str());
image.SetPixel(Math::IntPoint(0, 0), Gfx::Color(0.1f, 0.2f, 0.3f, 0.0f));
image.SetPixel(Math::IntPoint(1, 0), Gfx::Color(0.3f, 0.2f, 0.1f, 1.0f));
image.SetPixel(Math::IntPoint(0, 1), Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f));
image.SetPixel(Math::IntPoint(1, 1), Gfx::Color(0.0f, 0.0f, 0.0f, 1.0f));
if (! image.SavePNG(argv[2]))
{
std::string err = image.GetError();
printf("Error saving PNG '%s': %s\n", argv[2], err.c_str());
return 2;
}
return 0;
}

View File

@ -11,13 +11,14 @@
class CProfileTest : public testing::Test
{
protected:
CLogger m_logger;
CProfile m_profile;
};
TEST_F(CProfileTest, ReadTest)
{
m_profile.SetUseLocalDirectory(true);
ASSERT_TRUE(m_profile.InitCurrentDirectory()); // load colobot.ini file
std::string result;
@ -36,9 +37,3 @@ TEST_F(CProfileTest, ReadTest)
list = m_profile.GetLocalProfileSection("test_multi", "entry");
ASSERT_EQ(5u, list.size());
}
int main(int argc, char *argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View File

@ -1,46 +0,0 @@
set(SRC_DIR ${colobot_SOURCE_DIR}/src)
include_directories(
.
${SRC_DIR}
${GTEST_INCLUDE_DIR}
${GMOCK_INCLUDE_DIR}
${CLIPBOARD_INCLUDE_DIR}
)
# Platform-dependent implementation of CSystemUtils
if(PLATFORM_WINDOWS)
elseif(PLATFORM_MACOSX)
set(ADDITIONAL_LIB "${X11_X11_LIB}")
else()
set(ADDITIONAL_LIB "-lX11")
endif()
add_executable(edit_test
${SRC_DIR}/app/gamedata.cpp
${SRC_DIR}/app/system.cpp
${SRC_DIR}/app/${SYSTEM_CPP_MODULE}
${SRC_DIR}/app/system_other.cpp
${SRC_DIR}/common/event.cpp
${SRC_DIR}/common/logger.cpp
${SRC_DIR}/common/misc.cpp
${SRC_DIR}/common/profile.cpp
${SRC_DIR}/common/iman.cpp
${SRC_DIR}/common/stringutils.cpp
${SRC_DIR}/graphics/engine/text.cpp
${SRC_DIR}/ui/button.cpp
${SRC_DIR}/ui/control.cpp
${SRC_DIR}/ui/edit.cpp
${SRC_DIR}/ui/scroll.cpp
stubs/app_stub.cpp
stubs/engine_stub.cpp
stubs/particle_stub.cpp
stubs/restext_stub.cpp
stubs/robotmain_stub.cpp
edit_test.cpp)
target_link_libraries(edit_test gtest gmock clipboard ${SDL_LIBRARY} ${SDLTTF_LIBRARY} ${Boost_LIBRARIES} ${ADDITIONAL_LIB})
add_test(edit_test ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/edit_test)

View File

@ -1,90 +0,0 @@
#include "app/app.h"
#include "app/gamedata.h"
#include "ui/edit.h"
#include "mocks/text_mock.h"
#include <fstream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class CEditTest : public testing::Test
{
public:
CEditTest()
: m_robotMain(nullptr)
, m_gameData(nullptr)
, m_engine(nullptr)
, m_edit(nullptr)
{}
virtual void SetUp()
{
m_robotMain = new CRobotMain(&m_app, false);
m_gameData = new CGameData();
m_engine = new Gfx::CEngine(nullptr);
m_edit = new Ui::CEdit;
}
virtual void TearDown()
{
delete m_edit;
m_edit = nullptr;
delete m_engine;
m_engine = nullptr;
delete m_gameData;
m_gameData = nullptr;
delete m_robotMain;
m_robotMain = nullptr;
}
virtual ~CEditTest()
{
};
protected:
CApplication m_app;
CRobotMain* m_robotMain;
CGameData * m_gameData;
Gfx::CEngine * m_engine;
Ui::CEdit * m_edit;
CLogger m_logger;
};
using ::testing::_;
using ::testing::An;
using ::testing::Return;
TEST_F(CEditTest, WriteTest)
{
ASSERT_TRUE(true);
CTextMock * text = dynamic_cast<CTextMock *>(m_engine->GetText());
EXPECT_CALL(*text, GetCharWidth(_, _, _, _)).WillRepeatedly(Return(1.0f));
EXPECT_CALL(*text, GetStringWidth(An<const std::string&>(), _, _, _)).WillOnce(Return(1.0f));
std::string filename = "test.file";
m_edit->SetMaxChar(Ui::EDITSTUDIOMAX);
m_edit->SetAutoIndent(true);
std::string inputScript = "{\ntext1\ntext2\n\ntext3\n{\ntext4\n}\n}";
std::string expectedScript = "{\r\n\ttext1\r\n\ttext2\r\n\t\r\n\ttext3\r\n\t{\r\n\t\ttext4\r\n\t}\r\n}";
m_edit->SetText(inputScript.c_str(), true);
GetLogger()->Info("Writing text \n");
m_edit->WriteText("script.txt");
std::fstream scriptFile;
scriptFile.open("script.txt", std::ios_base::binary | std::ios_base::in);
std::string outputScript((std::istreambuf_iterator<char>(scriptFile)), std::istreambuf_iterator<char>());
ASSERT_STREQ(expectedScript.c_str(), outputScript.c_str());
}
int main(int argc, char *argv[])
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View File

@ -1,35 +0,0 @@
#include "common/logger.h"
#include "graphics/engine/text.h"
#include <gmock/gmock.h>
class CTextMock : public Gfx::CText
{
public:
CTextMock(Gfx::CEngine* engine) : CText(engine)
{
}
virtual ~CTextMock()
{
};
MOCK_METHOD4(GetCharWidth, float(Gfx::UTF8Char ch,
Gfx::FontType type,
float size,
float offset));
MOCK_METHOD4(GetStringWidth, float(const std::string &text,
std::vector<Gfx::FontMetaChar>::iterator format,
std::vector<Gfx::FontMetaChar>::iterator end,
float size));
MOCK_METHOD3(GetStringWidth, float(std::string text,
Gfx::FontType font,
float size));
MOCK_METHOD4(GetStringWidth, float(Gfx::UTF8Char ch,
Gfx::FontType font,
float size,
float offset));
};

View File

@ -1,42 +0,0 @@
#include "app/app.h"
#include "graphics/opengl/gldevice.h"
template<> CApplication* CSingleton<CApplication>::m_instance = nullptr;
namespace Gfx {
GLDeviceConfig::GLDeviceConfig()
{
}
} /* Gfx */
CApplication::CApplication()
{
}
CApplication::~CApplication()
{
}
CSoundInterface* CApplication::GetSound()
{
return nullptr;
}
CEventQueue* CApplication::GetEventQueue()
{
return nullptr;
}
Event CApplication::CreateUpdateEvent()
{
return Event(EVENT_NULL);
}
char CApplication::GetLanguageChar() const
{
return 'E';
}

View File

@ -1,104 +0,0 @@
#include "graphics/engine/engine.h"
#include "graphics/engine/text.h"
#include "mocks/text_mock.h"
template<> Gfx::CEngine* CSingleton<Gfx::CEngine>::m_instance = nullptr;
namespace Gfx {
CEngine::CEngine(CApplication* app) :
m_app(app)
{
m_text = new CTextMock(this);
m_text->Create();
}
CEngine::~CEngine()
{
delete m_text;
m_text = nullptr;
}
CParticle* CEngine::GetParticle()
{
return nullptr;
}
Math::Point CEngine::WindowToInterfaceSize(Math::IntPoint size)
{
return Math::Point(size.x, size.y);
}
void CEngine::SetState(int state, const Color& color)
{
if (state == m_lastState && color == m_lastColor)
return;
m_lastState = state;
m_lastColor = color;
}
Math::IntPoint CEngine::GetWindowSize()
{
return m_size;
}
void CEngine::AddStatisticTriangle(int count)
{
m_statisticTriangle += count;
}
void CEngine::SetMouseType(EngineMouseType type)
{
m_mouseType = type;
}
bool CEngine::SetTexture(const std::string& /* name */, int /* stage */)
{
return true;
}
CText* CEngine::GetText()
{
return m_text;
}
CDevice* CEngine::GetDevice()
{
return m_device;
}
int CEngine::GetEditIndentValue()
{
return m_editIndentValue;
}
void CEngine::DeleteTexture(const std::string& /* texName */)
{
}
Texture CEngine::LoadTexture(const std::string& /* name */)
{
Texture texture;
return texture;
}
Math::Vector CEngine::GetEyePt()
{
return Math::Vector();
}
Math::Vector CEngine::GetLookatPt()
{
return Math::Vector();
}
bool CEngine::GetPause()
{
return false;
}
} /* Gfx */

View File

@ -1,205 +0,0 @@
#include "graphics/engine/particle.h"
#include "common/logger.h"
// Graphics module namespace
namespace Gfx {
CParticle::CParticle(CEngine* /*engine*/)
{
}
CParticle::~CParticle()
{
}
void CParticle::SetDevice(CDevice* /*device*/)
{
}
void CParticle::FlushParticle()
{
}
void CParticle::FlushParticle(int /*sheet*/)
{
}
int CParticle::CreateParticle(Math::Vector /*pos*/, Math::Vector /*speed*/, Math::Point /*dim*/,
ParticleType /*type*/, float /*duration*/, float /*mass*/,
float /*windSensitivity*/, int /*sheet*/)
{
return 0;
}
int CParticle::CreateFrag(Math::Vector /*pos*/, Math::Vector /*speed*/, EngineTriangle */*triangle*/,
ParticleType /*type*/, float /*duration*/, float /*mass*/,
float /*windSensitivity*/, int /*sheet*/)
{
return 0;
}
int CParticle::CreatePart(Math::Vector /*pos*/, Math::Vector /*speed*/, ParticleType /*type*/,
float /*duration*/, float /*mass*/, float /*weight*/,
float /*windSensitivity*/, int /*sheet*/)
{
return 0;
}
int CParticle::CreateRay(Math::Vector /*pos*/, Math::Vector /*goal*/, ParticleType /*type*/, Math::Point /*dim*/,
float /*duration*/, int /*sheet*/)
{
return 0;
}
int CParticle::CreateTrack(Math::Vector /*pos*/, Math::Vector /*speed*/, Math::Point /*dim*/, ParticleType /*type*/,
float /*duration*/, float /*mass*/, float /*length*/, float /*width*/)
{
return 0;
}
void CParticle::CreateWheelTrace(const Math::Vector &/*p1*/, const Math::Vector &/*p2*/, const Math::Vector &/*p3*/,
const Math::Vector &/*p4*/, ParticleType /*type*/)
{
}
void CParticle::DeleteParticle(ParticleType /*type*/)
{
}
void CParticle::DeleteParticle(int /*channel*/)
{
}
void CParticle::SetObjectLink(int /*channel*/, CObject */*object*/)
{
}
void CParticle::SetObjectFather(int /*channel*/, CObject */*object*/)
{
}
void CParticle::SetPosition(int /*channel*/, Math::Vector /*pos*/)
{
}
void CParticle::SetDimension(int /*channel*/, Math::Point /*dim*/)
{
}
void CParticle::SetZoom(int /*channel*/, float /*zoom*/)
{
}
void CParticle::SetAngle(int /*channel*/, float /*angle*/)
{
}
void CParticle::SetIntensity(int /*channel*/, float /*intensity*/)
{
}
void CParticle::SetParam(int /*channel*/, Math::Vector /*pos*/, Math::Point /*dim*/, float /*zoom*/, float /*angle*/, float /*intensity*/)
{
}
void CParticle::SetPhase(int /*channel*/, ParticlePhase /*phase*/, float /*duration*/)
{
}
bool CParticle::GetPosition(int /*channel*/, Math::Vector &/*pos*/)
{
return true;
}
Color CParticle::GetFogColor(Math::Vector /*pos*/)
{
return Color();
}
void CParticle::SetFrameUpdate(int /*sheet*/, bool /*update*/)
{
}
void CParticle::FrameParticle(float /*rTime*/)
{
}
void CParticle::DrawParticle(int /*sheet*/)
{
}
bool CParticle::WriteWheelTrace(const char */*filename*/, int /*width*/, int /*height*/, Math::Vector /*dl*/, Math::Vector /*ur*/)
{
return true;
}
void CParticle::DeleteRank(int /*rank*/)
{
}
bool CParticle::CheckChannel(int &/*channel*/)
{
return true;
}
void CParticle::DrawParticleTriangle(int /*i*/)
{
}
void CParticle::DrawParticleNorm(int /*i*/)
{
}
void CParticle::DrawParticleFlat(int /*i*/)
{
}
void CParticle::DrawParticleFog(int /*i*/)
{
}
void CParticle::DrawParticleRay(int /*i*/)
{
}
void CParticle::DrawParticleSphere(int /*i*/)
{
}
void CParticle::DrawParticleCylinder(int /*i*/)
{
}
void CParticle::DrawParticleWheel(int /*i*/)
{
}
CObject* CParticle::SearchObjectGun(Math::Vector /*old*/, Math::Vector /*pos*/, ParticleType /*type*/, CObject */*father*/)
{
return nullptr;
}
CObject* CParticle::SearchObjectRay(Math::Vector /*pos*/, Math::Vector /*goal*/, ParticleType /*type*/, CObject */*father*/)
{
return nullptr;
}
void CParticle::Play(Sound /*sound*/, Math::Vector /*pos*/, float /*amplitude*/)
{
}
bool CParticle::TrackMove(int /*i*/, Math::Vector /*pos*/, float /*progress*/)
{
return true;
}
void CParticle::TrackDraw(int /*i*/, ParticleType /*type*/)
{
}
} // namespace Gfx

View File

@ -1,12 +0,0 @@
#include "common/restext.h"
bool GetResource(ResType /* type */, int /* num */, std::string& /* text */)
{
return true;
}
bool SearchKey(const char * /* cmd */, InputSlot & /* key */)
{
return true;
}

View File

@ -1,25 +0,0 @@
#include "object/robotmain.h"
template<> CRobotMain* CSingleton<CRobotMain>::m_instance = nullptr;
CRobotMain::CRobotMain(CApplication* app, bool loadProfile)
{
}
CRobotMain::~CRobotMain()
{
}
bool CRobotMain::GetGlint()
{
return false;
}
const InputBinding& CRobotMain::GetInputBinding(InputSlot slot)
{
unsigned int index = static_cast<unsigned int>(slot);
assert(index >= 0 && index < INPUT_SLOT_MAX);
return m_inputBindings[index];
}