enable_testing()
# MUST do this before including IDNA
# because it will otherwise poison GTest with BUILD_GMOCK=OFF
find_package(GTest CONFIG REQUIRED COMPONENTS gtest gmock)

find_package(jsoncpp REQUIRED)
find_package(CURL REQUIRED)

# ICU Components Reference:
# https://cmake.org/cmake/help/latest/module/FindICU.html
# ICU components = data, i18n, io, le, lx, test, tu and uc.
find_package(ICU 77.1 COMPONENTS uc i18n)

FetchContent_Declare(
  IDNA
  GIT_REPOSITORY https://github.com/ada-url/idna.git
  GIT_TAG        0.5.0
)
FetchContent_MakeAvailable(IDNA)

FetchContent_Declare(
  json_schema_test_suite
  GIT_REPOSITORY https://github.com/json-schema-org/JSON-Schema-Test-Suite.git
  GIT_TAG        Test-JSON-Schema-Acceptance-1.037
)
FetchContent_MakeAvailable(json_schema_test_suite)

include(GoogleTest)

add_executable(annotation_test annotation_test.cxx)
target_link_libraries(annotation_test GTest::gtest GTest::gmock ada-idna jsoncpp_lib)
gtest_discover_tests(annotation_test)

add_executable(extension_test extension_test.cxx)
target_link_libraries(extension_test GTest::gtest GTest::gmock ada-idna jsoncpp_lib)
gtest_discover_tests(extension_test)

add_executable(selfvalidate_test selfvalidate_test.cxx)
target_compile_definitions(selfvalidate_test PUBLIC JVALIDATE_USE_EXCEPTIONS)
if (${json_schema_test_suite_POPULATED})
target_compile_definitions(selfvalidate_test
    PUBLIC
    JVALIDATE_JSON_SCHEMA_TEST_SUITE_DIR="${json_schema_test_suite_SOURCE_DIR}"
)
endif()
target_link_libraries(selfvalidate_test GTest::gtest GTest::gmock ada-idna jsoncpp_lib CURL::libcurl)

if (ICU_FOUND)
  target_link_libraries(annotation_test ICU::uc ICU::i18n)
  target_link_libraries(extension_test ICU::uc ICU::i18n)
  target_link_libraries(selfvalidate_test ICU::uc ICU::i18n)
endif()

string(
  JOIN ":"
  SelfValidateTest_Unsupported
  "*optional_content"
  "*optional_*ecmascript_regex"
  "*optional_zeroTerminatedFloats"
)
if (NOT ${ICU_FOUND})
  string(
    JOIN ":"
    SelfValidateTest_Unsupported
    ${SelfValidateTest_Unsupported}
    "*optional_non_bmp_regex"
  )
endif()
set(SelfValidateTest_Unsupported_Cases "*leap second")

gtest_discover_tests(selfvalidate_test
                     EXTRA_ARGS --json_case_filter=-${SelfValidateTest_Unsupported_Cases}
                     TEST_FILTER -${SelfValidateTest_Unsupported})
