# Add a special definition for the unit tests when the run-on-Valgrind
# option is selected.
if(RUN_ON_VALGRIND AND CMAKE_BUILD_TYPE STREQUAL "Debug")
	add_definitions(-DPIRANHA_RUN_ON_VALGRIND)
endif()

# Pass the current source dir as a definition, so we can load data for tests from the source dir.
add_definitions(-DPIRANHA_TESTS_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}")

# Setup for the split compilation of tests.

# This is just a simple counter variable, internal use only.
set(PIRANHA_TEST_NUM "0")

# Check splitting options. These need to be set from the command line.
# - PIRANHA_TEST_NSPLIT: number of chunks into which the unit tests will be divided (must be > 1).
# - PIRANHA_TEST_SPLIT_NUM: 0-based index of the chunk to run.
if(PIRANHA_TEST_NSPLIT AND "${PIRANHA_TEST_SPLIT_NUM}" STREQUAL "")
	message(FATAL_ERROR "Test splitting was requested, but the PIRANHA_TEST_SPLIT_NUM variable was not set.")
elseif(NOT PIRANHA_TEST_NSPLIT AND NOT "${PIRANHA_TEST_SPLIT_NUM}" STREQUAL "")
	message(FATAL_ERROR "The PIRANHA_TEST_SPLIT_NUM variable was set, but test splitting was not requested.")
endif()

if(PIRANHA_TEST_NSPLIT)
	message(STATUS "Tests will be split into ${PIRANHA_TEST_NSPLIT} chunks. The chunk with index ${PIRANHA_TEST_SPLIT_NUM} will be processed.")
endif()

MACRO(ADD_PIRANHA_TESTCASE arg1)
	IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
		if(PIRANHA_TEST_NSPLIT)
			math(EXPR PIRANHA_TEST_NUM "(${PIRANHA_TEST_NUM} + 1) % ${PIRANHA_TEST_NSPLIT}")
		endif()
		if(NOT PIRANHA_TEST_NSPLIT OR "${PIRANHA_TEST_SPLIT_NUM}" STREQUAL "${PIRANHA_TEST_NUM}")
			ADD_EXECUTABLE("${arg1}" "${arg1}.cpp")
			TARGET_LINK_LIBRARIES("${arg1}" ${MANDATORY_LIBRARIES} ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY})
			ADD_TEST("${arg1}" "${arg1}")
		endif()
	ENDIF()
ENDMACRO()

MACRO(ADD_PIRANHA_PERFORMANCE_TESTCASE arg1)
	IF(CMAKE_BUILD_TYPE STREQUAL "Release")
		if(PIRANHA_TEST_NSPLIT)
			math(EXPR PIRANHA_TEST_NUM "(${PIRANHA_TEST_NUM} + 1) % ${PIRANHA_TEST_NSPLIT}")
		endif()
		if(NOT PIRANHA_TEST_NSPLIT OR "${PIRANHA_TEST_SPLIT_NUM}" STREQUAL "${PIRANHA_TEST_NUM}")
			ADD_EXECUTABLE("${arg1}_perf" "${arg1}_perf.cpp")
			TARGET_LINK_LIBRARIES("${arg1}_perf" ${MANDATORY_LIBRARIES} ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY})
			ADD_TEST("${arg1}_perf" "${arg1}_perf")
		ENDIF()
	ENDIF(CMAKE_BUILD_TYPE STREQUAL "Release")
ENDMACRO(ADD_PIRANHA_PERFORMANCE_TESTCASE)

ADD_PIRANHA_TESTCASE(array_key)
ADD_PIRANHA_TESTCASE(atomic_utils)
ADD_PIRANHA_TESTCASE(base_series_multiplier)
ADD_PIRANHA_TESTCASE(cache_aligning_allocator)
ADD_PIRANHA_TESTCASE(convert_to)
ADD_PIRANHA_TESTCASE(demangle)
ADD_PIRANHA_TESTCASE(divisor_01)
ADD_PIRANHA_TESTCASE(divisor_02)
ADD_PIRANHA_TESTCASE(divisor_series_01)
ADD_PIRANHA_TESTCASE(divisor_series_02)
ADD_PIRANHA_TESTCASE(dynamic_aligning_allocator)
ADD_PIRANHA_TESTCASE(exceptions)
ADD_PIRANHA_TESTCASE(hash_set_01)
ADD_PIRANHA_TESTCASE(hash_set_02)
ADD_PIRANHA_TESTCASE(init)
ADD_PIRANHA_TESTCASE(invert)
ADD_PIRANHA_TESTCASE(ipow_substitutable_series)
ADD_PIRANHA_TESTCASE(lambdify)
ADD_PIRANHA_TESTCASE(key_is_convertible)
ADD_PIRANHA_TESTCASE(key_is_multipliable)
ADD_PIRANHA_TESTCASE(kronecker_array)
ADD_PIRANHA_TESTCASE(kronecker_monomial_01)
ADD_PIRANHA_TESTCASE(kronecker_monomial_02)
ADD_PIRANHA_TESTCASE(math)
ADD_PIRANHA_TESTCASE(memory)
ADD_PIRANHA_TESTCASE(monomial_01)
ADD_PIRANHA_TESTCASE(monomial_02)
ADD_PIRANHA_TESTCASE(mp_integer_01)
ADD_PIRANHA_TESTCASE(mp_integer_02)
ADD_PIRANHA_TESTCASE(mp_integer_03)
ADD_PIRANHA_TESTCASE(mp_integer_04)
ADD_PIRANHA_TESTCASE(mp_integer_05)
ADD_PIRANHA_TESTCASE(mp_rational_01)
ADD_PIRANHA_TESTCASE(mp_rational_02)
ADD_PIRANHA_TESTCASE(parallel_vector_transform)
ADD_PIRANHA_TESTCASE(poisson_series_01)
ADD_PIRANHA_TESTCASE(poisson_series_02)
ADD_PIRANHA_TESTCASE(poisson_series_03)
ADD_PIRANHA_TESTCASE(polynomial_01)
ADD_PIRANHA_TESTCASE(polynomial_02)
ADD_PIRANHA_TESTCASE(polynomial_03)
ADD_PIRANHA_TESTCASE(polynomial_04)
ADD_PIRANHA_TESTCASE(polynomial_05)
ADD_PIRANHA_TESTCASE(polynomial_multiplier_01)
ADD_PIRANHA_TESTCASE(polynomial_multiplier_02)
ADD_PIRANHA_TESTCASE(polynomial_multiplier_03)
ADD_PIRANHA_TESTCASE(polynomial_truncation)
ADD_PIRANHA_TESTCASE(power_series_01)
ADD_PIRANHA_TESTCASE(power_series_02)
ADD_PIRANHA_TESTCASE(print_coefficient)
ADD_PIRANHA_TESTCASE(print_tex_coefficient)
ADD_PIRANHA_TESTCASE(rational_function_01)
ADD_PIRANHA_TESTCASE(rational_function_02)
ADD_PIRANHA_TESTCASE(rational_function_03)
ADD_PIRANHA_TESTCASE(real_01)
ADD_PIRANHA_TESTCASE(real_02)
ADD_PIRANHA_TESTCASE(real_trigonometric_kronecker_monomial_01)
ADD_PIRANHA_TESTCASE(real_trigonometric_kronecker_monomial_02)
ADD_PIRANHA_TESTCASE(runtime_info)
ADD_PIRANHA_TESTCASE(s11n)
ADD_PIRANHA_TESTCASE(safe_cast)
ADD_PIRANHA_TESTCASE(safe_integral_adder)
ADD_PIRANHA_TESTCASE(series_01)
ADD_PIRANHA_TESTCASE(series_02)
ADD_PIRANHA_TESTCASE(series_03)
ADD_PIRANHA_TESTCASE(series_04)
ADD_PIRANHA_TESTCASE(series_05)
ADD_PIRANHA_TESTCASE(series_06)
ADD_PIRANHA_TESTCASE(series_07)
ADD_PIRANHA_TESTCASE(series_08)
ADD_PIRANHA_TESTCASE(settings)
ADD_PIRANHA_TESTCASE(small_vector_01)
ADD_PIRANHA_TESTCASE(small_vector_02)
ADD_PIRANHA_TESTCASE(static_vector_01)
ADD_PIRANHA_TESTCASE(static_vector_02)
ADD_PIRANHA_TESTCASE(substitutable_series)
ADD_PIRANHA_TESTCASE(symbol)
ADD_PIRANHA_TESTCASE(symbol_set)
ADD_PIRANHA_TESTCASE(t_substitutable_series)
ADD_PIRANHA_TESTCASE(term)
ADD_PIRANHA_TESTCASE(thread_barrier)
ADD_PIRANHA_TESTCASE(thread_management)
ADD_PIRANHA_TESTCASE(thread_pool)
ADD_PIRANHA_TESTCASE(trigonometric_series)
ADD_PIRANHA_TESTCASE(tuning)
ADD_PIRANHA_TESTCASE(type_traits)
ADD_PIRANHA_TESTCASE(ulshift)

ADD_PIRANHA_PERFORMANCE_TESTCASE(audi)
ADD_PIRANHA_PERFORMANCE_TESTCASE(estimation)
ADD_PIRANHA_PERFORMANCE_TESTCASE(evaluate)
ADD_PIRANHA_PERFORMANCE_TESTCASE(fateman1)
ADD_PIRANHA_PERFORMANCE_TESTCASE(fateman1_dynamic)
ADD_PIRANHA_PERFORMANCE_TESTCASE(fateman1_rational)
ADD_PIRANHA_PERFORMANCE_TESTCASE(fateman1_unpacked)
ADD_PIRANHA_PERFORMANCE_TESTCASE(fateman1_unpacked_truncation)
ADD_PIRANHA_PERFORMANCE_TESTCASE(fateman2)
ADD_PIRANHA_PERFORMANCE_TESTCASE(gastineau1)
ADD_PIRANHA_PERFORMANCE_TESTCASE(gastineau2)
ADD_PIRANHA_PERFORMANCE_TESTCASE(gastineau3)
ADD_PIRANHA_PERFORMANCE_TESTCASE(gastineau4)
ADD_PIRANHA_PERFORMANCE_TESTCASE(memory)
ADD_PIRANHA_PERFORMANCE_TESTCASE(monagan1)
ADD_PIRANHA_PERFORMANCE_TESTCASE(monagan2)
ADD_PIRANHA_PERFORMANCE_TESTCASE(monagan3)
ADD_PIRANHA_PERFORMANCE_TESTCASE(monagan4)
ADD_PIRANHA_PERFORMANCE_TESTCASE(monagan5)
ADD_PIRANHA_PERFORMANCE_TESTCASE(power_series)
ADD_PIRANHA_PERFORMANCE_TESTCASE(pearce1)
ADD_PIRANHA_PERFORMANCE_TESTCASE(pearce1_dynamic)
ADD_PIRANHA_PERFORMANCE_TESTCASE(pearce1_rational)
ADD_PIRANHA_PERFORMANCE_TESTCASE(pearce1_unpacked)
ADD_PIRANHA_PERFORMANCE_TESTCASE(pearce2)
ADD_PIRANHA_PERFORMANCE_TESTCASE(pearce2_unpacked)
if(PIRANHA_WITH_MSGPACK AND PIRANHA_WITH_BZIP2)
	ADD_PIRANHA_PERFORMANCE_TESTCASE(perminov1)
endif()
ADD_PIRANHA_PERFORMANCE_TESTCASE(rectangular)
ADD_PIRANHA_PERFORMANCE_TESTCASE(s11n)
ADD_PIRANHA_PERFORMANCE_TESTCASE(symengine_expand2b)
