if (SCN_BUILD_FUZZING OR SCN_INCLUDE_FUZZING)
    add_subdirectory(fuzz)
endif ()

if (NOT SCN_TESTS)
    return()
endif ()

include(CTest)

add_library(tests-base INTERFACE)

find_package(doctest QUIET)
if (NOT doctest_FOUND)
    target_include_directories(tests-base SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/doctest)
else ()
    target_link_libraries(tests-base INTERFACE doctest::doctest)
endif ()

if (NOT SCN_USE_EXCEPTIONS)
    target_compile_definitions(tests-base INTERFACE -DDOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS=1)
endif ()
target_link_libraries(tests-base INTERFACE scn-sanitizers)

set(SCN_TEST_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/..")
function(make_test test source)
    add_executable(test-${test} ${source})
    target_link_libraries(test-${test} PRIVATE scn tests-base)
    set_private_flags(test-${test})
    add_test(NAME ${test} COMMAND test-${test} WORKING_DIRECTORY ${SCN_TEST_WORKING_DIRECTORY})
endfunction()

make_test(test test.cpp)
make_test(empty empty.cpp)
make_test(fwd fwd.cpp)

make_test(util util.cpp)
make_test(small-vector small_vector.cpp)
make_test(string-view string_view.cpp)
make_test(reader reader.cpp)
make_test(range range.cpp)
make_test(locale locale.cpp)
make_test(std-string-view std_string_view.cpp)
make_test(pmr-string pmr_string.cpp)
make_test(wrap wrap.cpp)
make_test(utf8 utf8.cpp)
make_test(utf16 utf16.cpp)

make_test(result result.cpp)
make_test(istream istream.cpp)
make_test(format format.cpp)
make_test(tuple-return tuple_return.cpp)

make_test(char char.cpp)
make_test(integer integer.cpp)
make_test(float floating.cpp)
make_test(string string.cpp)
make_test(string-set string_set.cpp)
make_test(buffer buffer.cpp)
make_test(bool boolean.cpp)
make_test(usertype usertype.cpp)
make_test(list list.cpp)

if (SCN_BUILD_LOCALIZED_TESTS)
    add_subdirectory(localized)
endif ()

add_subdirectory(each)
add_subdirectory(file)

