BareGit
cmake_minimum_required(VERSION 3.26)

project(
    card_collection
    VERSION 0.1.0
    LANGUAGES CXX
)

option(
    CARD_COLLECTION_BUILD_TESTS
    "Build the Card Collection test suite"
    ON
)

include(cmake/dependencies.cmake)

add_executable(
    card_collection
    src/app.cpp
    src/asset_store.cpp
    src/authentication.cpp
    src/authorization.cpp
    src/card_pool.cpp
    src/card_service.cpp
    src/clock.cpp
    src/collection.cpp
    src/config.cpp
    src/data.cpp
    src/data_sqlite.cpp
    src/email_address.cpp
    src/email_sender_file.cpp
    src/email_sender_mailjet.cpp
    src/game_field.cpp
    src/game_service.cpp
    src/image_processor.cpp
    src/markdown_renderer.cpp
    src/main.cpp
    src/multipart_reader.cpp
    src/non_secret_random.cpp
    src/public_id.cpp
    src/series_service.cpp
    src/secret_token.cpp
    src/startup.cpp
    src/username.cpp
    src/user_service.cpp
    src/url_builder.cpp
)

target_compile_features(card_collection PRIVATE cxx_std_23)
target_compile_definitions(
    card_collection
    PRIVATE
        CARD_COLLECTION_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
)
set_target_properties(
    card_collection
    PROPERTIES
        CXX_EXTENSIONS OFF
)

if(MSVC)
    target_compile_options(card_collection PRIVATE /W4 /permissive-)
else()
    target_compile_options(
        card_collection
        PRIVATE
            -Wall
            -Wextra
            -Wpedantic
    )
endif()

target_link_libraries(
    card_collection
    PRIVATE
        ImageMagick::Magick++
        ImageMagick::MagickWand
        ImageMagick::MagickCore
        MacroDown::MacroDown
        mw::http-server
        mw::crypto
        mw::mw
        mw::sqlite
        mw::url
        nlohmann_json::nlohmann_json
        pantor::inja
        spdlog::spdlog
        tomlplusplus::tomlplusplus
        uni-algo::uni-algo
)

if(CARD_COLLECTION_BUILD_TESTS)
    include(CTest)
    enable_testing()

    add_executable(
        data_mock_test
        src/data.cpp
        tests/data_mock_test.cpp
    )
    target_compile_features(data_mock_test PRIVATE cxx_std_23)
    set_target_properties(data_mock_test PROPERTIES CXX_EXTENSIONS OFF)
    target_include_directories(
        data_mock_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
            tests
    )
    target_link_libraries(
        data_mock_test
        PRIVATE
            GTest::gmock_main
            mw::mw
    )

    include(GoogleTest)
    gtest_discover_tests(data_mock_test)

    add_executable(
        mvp_primitives_test
        src/authorization.cpp
        src/card_pool.cpp
        src/clock.cpp
        src/email_address.cpp
        src/email_sender_file.cpp
        src/secret_token.cpp
        src/username.cpp
        tests/mvp_primitives_test.cpp
    )
    target_compile_features(mvp_primitives_test PRIVATE cxx_std_23)
    set_target_properties(
        mvp_primitives_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        mvp_primitives_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        mvp_primitives_test
        PRIVATE
            GTest::gmock_main
            mw::crypto
            mw::mw
            mw::url
            uni-algo::uni-algo
    )
    gtest_discover_tests(mvp_primitives_test)

    add_executable(
        game_field_test
        src/game_field.cpp
        tests/game_field_test.cpp
    )
    target_compile_features(game_field_test PRIVATE cxx_std_23)
    set_target_properties(game_field_test PROPERTIES CXX_EXTENSIONS OFF)
    target_include_directories(
        game_field_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        game_field_test
        PRIVATE
            GTest::gtest_main
            mw::mw
    )
    gtest_discover_tests(game_field_test)

    add_executable(
        game_service_test
        src/authorization.cpp
        src/data.cpp
        src/data_sqlite.cpp
        src/game_field.cpp
        src/game_service.cpp
        src/markdown_renderer.cpp
        src/startup.cpp
        tests/game_service_test.cpp
    )
    target_compile_features(game_service_test PRIVATE cxx_std_23)
    set_target_properties(
        game_service_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        game_service_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        game_service_test
        PRIVATE
            GTest::gtest_main
            MacroDown::MacroDown
            mw::mw
            mw::sqlite
            mw::url
            spdlog::spdlog
    )
    gtest_discover_tests(game_service_test)

    add_executable(
        user_collection_test
        src/card_pool.cpp
        src/clock.cpp
        src/collection.cpp
        src/data.cpp
        src/data_sqlite.cpp
        src/game_field.cpp
        src/startup.cpp
        src/username.cpp
        src/user_service.cpp
        tests/user_collection_test.cpp
    )
    target_compile_features(user_collection_test PRIVATE cxx_std_23)
    set_target_properties(
        user_collection_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        user_collection_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        user_collection_test
        PRIVATE
            GTest::gmock_main
            mw::crypto
            mw::mw
            mw::sqlite
            spdlog::spdlog
            uni-algo::uni-algo
    )
    gtest_discover_tests(user_collection_test)

    add_executable(
        authentication_test
        src/authentication.cpp
        src/clock.cpp
        src/data.cpp
        src/data_sqlite.cpp
        src/email_address.cpp
        src/game_field.cpp
        src/secret_token.cpp
        src/startup.cpp
        tests/authentication_test.cpp
    )
    target_compile_features(authentication_test PRIVATE cxx_std_23)
    set_target_properties(
        authentication_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        authentication_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        authentication_test
        PRIVATE
            GTest::gmock_main
            mw::crypto
            mw::mw
            mw::sqlite
            mw::url
            spdlog::spdlog
    )
    gtest_discover_tests(authentication_test)

    add_executable(
        email_sender_mailjet_test
        src/email_sender_mailjet.cpp
        tests/email_sender_mailjet_test.cpp
    )
    target_compile_features(email_sender_mailjet_test PRIVATE cxx_std_23)
    set_target_properties(
        email_sender_mailjet_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        email_sender_mailjet_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        email_sender_mailjet_test
        PRIVATE
            GTest::gmock_main
            mw::mw
            mw::url
            nlohmann_json::nlohmann_json
    )
    gtest_discover_tests(email_sender_mailjet_test)

    add_executable(
        config_test
        src/config.cpp
        src/email_address.cpp
        src/non_secret_random.cpp
        tests/config_test.cpp
    )
    target_compile_features(config_test PRIVATE cxx_std_23)
    set_target_properties(config_test PROPERTIES CXX_EXTENSIONS OFF)
    target_include_directories(
        config_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        config_test
        PRIVATE
            GTest::gtest_main
            mw::http-server
            mw::mw
            mw::url
            tomlplusplus::tomlplusplus
            uni-algo::uni-algo
    )
    gtest_discover_tests(config_test)

    add_executable(
        markdown_renderer_test
        src/markdown_renderer.cpp
        tests/markdown_renderer_test.cpp
    )
    target_compile_features(markdown_renderer_test PRIVATE cxx_std_23)
    set_target_properties(
        markdown_renderer_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        markdown_renderer_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        markdown_renderer_test
        PRIVATE
            GTest::gtest_main
            MacroDown::MacroDown
            mw::mw
            mw::url
    )
    gtest_discover_tests(markdown_renderer_test)

    add_executable(
        app_test
        src/app.cpp
        src/asset_store.cpp
        src/authentication.cpp
        src/authorization.cpp
        src/card_pool.cpp
        src/card_service.cpp
        src/clock.cpp
        src/collection.cpp
        src/data.cpp
        src/email_address.cpp
        src/email_sender_file.cpp
        src/email_sender_mailjet.cpp
        src/game_field.cpp
        src/game_service.cpp
        src/non_secret_random.cpp
        src/data_fake.cpp
        src/image_processor.cpp
        src/markdown_renderer.cpp
        src/multipart_reader.cpp
        src/public_id.cpp
        src/series_service.cpp
        src/secret_token.cpp
        src/username.cpp
        src/user_service.cpp
        src/url_builder.cpp
        tests/app_test.cpp
    )
    target_compile_features(app_test PRIVATE cxx_std_23)
    set_target_properties(app_test PROPERTIES CXX_EXTENSIONS OFF)
    target_include_directories(
        app_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        app_test
        PRIVATE
            GTest::gtest_main
            ImageMagick::Magick++
            ImageMagick::MagickWand
            ImageMagick::MagickCore
            MacroDown::MacroDown
            mw::http-server
            mw::crypto
            mw::mw
            mw::sqlite
            mw::url
            nlohmann_json::nlohmann_json
            pantor::inja
            spdlog::spdlog
            uni-algo::uni-algo
    )
    target_compile_definitions(
        app_test
        PRIVATE
            CARD_COLLECTION_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
    )
    gtest_discover_tests(app_test)

    add_executable(
        app_integration_test
        src/app.cpp
        src/asset_store.cpp
        src/authentication.cpp
        src/authorization.cpp
        src/card_pool.cpp
        src/card_service.cpp
        src/clock.cpp
        src/collection.cpp
        src/data.cpp
        src/data_sqlite.cpp
        src/email_address.cpp
        src/email_sender_file.cpp
        src/email_sender_mailjet.cpp
        src/game_field.cpp
        src/game_service.cpp
        src/image_processor.cpp
        src/markdown_renderer.cpp
        src/multipart_reader.cpp
        src/non_secret_random.cpp
        src/public_id.cpp
        src/series_service.cpp
        src/secret_token.cpp
        src/startup.cpp
        src/username.cpp
        src/user_service.cpp
        src/url_builder.cpp
        tests/app_integration_test.cpp
    )
    target_compile_features(app_integration_test PRIVATE cxx_std_23)
    set_target_properties(
        app_integration_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        app_integration_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_compile_definitions(
        app_integration_test
        PRIVATE
            CARD_COLLECTION_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
    )
    target_link_libraries(
        app_integration_test
        PRIVATE
            GTest::gtest_main
            ImageMagick::Magick++
            ImageMagick::MagickWand
            ImageMagick::MagickCore
            MacroDown::MacroDown
            mw::http-server
            mw::crypto
            mw::mw
            mw::sqlite
            mw::url
            nlohmann_json::nlohmann_json
            pantor::inja
            spdlog::spdlog
            uni-algo::uni-algo
    )
    gtest_discover_tests(app_integration_test)

    add_executable(
        data_fake_test
        src/data.cpp
        src/data_fake.cpp
        tests/data_fake_test.cpp
    )
    target_compile_features(data_fake_test PRIVATE cxx_std_23)
    set_target_properties(data_fake_test PROPERTIES CXX_EXTENSIONS OFF)
    target_include_directories(
        data_fake_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        data_fake_test
        PRIVATE
            GTest::gtest_main
            mw::mw
    )
    gtest_discover_tests(data_fake_test)

    add_executable(
        data_sqlite_test
        src/data.cpp
        src/data_sqlite.cpp
        src/game_field.cpp
        src/startup.cpp
        tests/data_sqlite_test.cpp
    )
    target_compile_features(data_sqlite_test PRIVATE cxx_std_23)
    set_target_properties(data_sqlite_test PROPERTIES CXX_EXTENSIONS OFF)
    target_include_directories(
        data_sqlite_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        data_sqlite_test
        PRIVATE
            GTest::gtest_main
            mw::mw
            mw::sqlite
            spdlog::spdlog
    )
    gtest_discover_tests(data_sqlite_test)

    add_executable(
        card_service_test
        src/asset_store.cpp
        src/authorization.cpp
        src/card_service.cpp
        src/data.cpp
        src/data_sqlite.cpp
        src/game_field.cpp
        src/image_processor.cpp
        src/markdown_renderer.cpp
        src/multipart_reader.cpp
        src/non_secret_random.cpp
        src/public_id.cpp
        src/series_service.cpp
        src/startup.cpp
        tests/card_service_test.cpp
    )
    target_compile_features(card_service_test PRIVATE cxx_std_23)
    set_target_properties(
        card_service_test
        PROPERTIES CXX_EXTENSIONS OFF
    )
    target_include_directories(
        card_service_test
        PRIVATE
            ${libmw_SOURCE_DIR}/includes
            src
    )
    target_link_libraries(
        card_service_test
        PRIVATE
            GTest::gtest_main
            ImageMagick::Magick++
            ImageMagick::MagickWand
            ImageMagick::MagickCore
            MacroDown::MacroDown
            mw::http-server
            mw::mw
            mw::sqlite
            spdlog::spdlog
    )
    gtest_discover_tests(card_service_test)

    find_program(NODE_EXECUTABLE node)
    if(NODE_EXECUTABLE)
        add_test(
            NAME CardFormLogicTest
            COMMAND ${NODE_EXECUTABLE} --test
                    ${CMAKE_CURRENT_SOURCE_DIR}/tests/card_form_logic_test.js
        )
        add_test(
            NAME CardPreviewMathTest
            COMMAND ${NODE_EXECUTABLE} --test
                    ${CMAKE_CURRENT_SOURCE_DIR}/tests/card_preview_math_test.js
        )
        add_test(
            NAME GameFieldFormLogicTest
            COMMAND ${NODE_EXECUTABLE} --test
                    ${CMAKE_CURRENT_SOURCE_DIR}/tests/game_field_form_logic_test.js
        )
    endif()
endif()