cmake_minimum_required(VERSION 3.7)

project(test_runner CXX)

get_filename_component(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" ABSOLUTE)
get_filename_component(CMAKE_EXTERNALS "${CMAKE_EXTERNALS}" ABSOLUTE)

include(Util)
include(UtilBoost)
include(CppUnit)
include(Libiconv)
include(GMock)
include(CTest)

if(BUILD_OPENSUSE)
    require_util()
    require_cppunit()
    require_gmock()
else()
    find_util()
    find_cppunit()
    find_gmock()
endif()

set(UTIL_TEST_SOURCES
	cpp/boost/optional/functional_tester.cpp 
	cpp/boost/optional/is_optional_tester.cpp 
	cpp/boost/range/any_range_tester.cpp 
	cpp/util/algorithm/normalization_tester.cpp 
	cpp/util/convert/convert_tester.cpp 
	cpp/util/data/coupling_loader_tester.cpp 
	cpp/util/data/data_tester.cpp
	cpp/util/data/dataset_tester.cpp 
#	cpp/util/data/test_dataset_collection.cpp 
#	cpp/util/data/test_dataset_matrix.cpp
	cpp/util/data/transform_loader_tester.cpp
	cpp/util/data/file/delimited_column_loader_tester.cpp
	cpp/util/data/file/file_data_tester.cpp
	cpp/util/data/file/line_range_tester.cpp
	cpp/util/data/file/shared_file_data_tester.cpp
#	cpp/util/data/file/test_line_filter.cpp
#	cpp/util/data/file/test_tokenizer_range.cpp
	cpp/util/data/file/tokenizer_loader_tester.cpp
	cpp/util/functional/distance/euclidean_distance_tester.cpp
	cpp/util/functional/distance/minkowski_distance_tester.cpp
	cpp/util/iterator/output/back_insert_reference_iterator_tester.cpp
#	cpp/util/object/test_numbered_name_range.cpp
#	cpp/util/object/test_object_collection.cpp
	cpp/util/range/address_range_tester.cpp
	cpp/util/range/lexical_cast_range_tester.cpp
	cpp/util/range/ref_range_tester.cpp
#	cpp/util/range/test_element_at.cpp
	cpp/util/range/transform_all_range_tester.cpp
	cpp/util/range/unwrap_range_tester.cpp
	cpp/util/range/zipped_with_range_tester.cpp)

# see https://www.boost.org/doc/libs/master/libs/config/doc/html/boost_config/boost_macro_reference.html
set(COMPILE_FLAGS_PROPERTIES "-DBOOST_NO_AUTO_PTR -Wno-nonnull")

if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6)
    # gnu++14 is now the default standard 
    # see https://gcc.gnu.org/gcc-6/changes.html
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -std=gnu++14")
endif()

if(CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 12)
	# The standard library no longer supports std::unary_function and std::binary_function. They were deprecated in C++11 and is removed from C++14.
	# see https://www.boost.org/doc/libs/1_69_0/libs/config/doc/html/boost_config/boost_macro_reference.html
	# gcc 12 warns deprecated-declarations
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -DBOOST_NO_CXX98_FUNCTION_BASE")
endif()

if(BOOST_VERSION VERSION_LESS 1.67)
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-parentheses -Wno-deprecated-declarations")
elseif(BOOST_VERSION VERSION_LESS 1.68)    
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -Wno-parentheses")
elseif(BOOST_VERSION VERSION_EQUAL 1.74)
    set(COMPILE_FLAGS_PROPERTIES "${COMPILE_FLAGS_PROPERTIES} -DBOOST_ALLOW_DEPRECATED_HEADERS")
endif()

if(COMPILE_FLAGS_PROPERTIES)
    message(STATUS "Util Test CXX compile flags: ${COMPILE_FLAGS_PROPERTIES}")
    set_source_files_properties(${UTIL_TEST_SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS_PROPERTIES})
endif()

add_executable(test_runner cpp/test_runner.cpp ${UTIL_TEST_SOURCES})
target_link_libraries(test_runner ${UTIL_BOOST_PREFIX_LIBRARIES} ${CppUnit_LIBRARY_NAME} ${GTest_LIBRARY_NAME} ${GMock_LIBRARY_NAME} ${Libiconv_LIBRARY_NAME} ${Libcharset_LIBRARY_NAME} ${Util_LIBRARY_NAME} ${CMAKE_THREAD_LIBS_INIT})
if(DEPENDENCIES)
	message(STATUS "Util Test Dependencies = ${DEPENDENCIES}")
	add_dependencies(test_runner ${DEPENDENCIES})
endif()	

concat_path(PATH ${CXX_RUNTIME_DIR} ${Boost_LIBRARY_DIRS} ${CppUnit_RUNTIME_DIR} ${Libiconv_RUNTIME_DIR} ${Util_RUNTIME_DIR})
add_tests(${CMAKE_CURRENT_BINARY_DIR}/test_runner "${PATH}" ${UTIL_TEST_SOURCES})

add_custom_command(TARGET test_runner POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/resources" "${CMAKE_CURRENT_BINARY_DIR}/resources")
