set(
  cmake_opts
  "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}"
  "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
)

# Temporary installation prefix for tests against installed project:
set(tmp_install_prefix "${CMAKE_CURRENT_BINARY_DIR}/test_install")

foreach (root_type IN ITEMS SOURCE INSTALL)
  if (root_type STREQUAL "INSTALL")
    set(cccl_root "${tmp_install_prefix}")
  else()
    set(cccl_root "${CCCL_SOURCE_DIR}")
  endif()

  set(comps DEFAULT Thrust CUB libcudacxx)
  if (CCCL_ENABLE_UNSTABLE)
    list(APPEND comps cudax)
  endif()

  foreach (components IN LISTS comps)
    set(package_types CCCL)
    if (NOT components STREQUAL "DEFAULT")
      list(APPEND package_types NATIVE)
    endif()
    if (root_type STREQUAL "SOURCE")
      list(APPEND package_types SUBDIR)
    endif()
    foreach (package_type IN LISTS package_types)
      string(TOLOWER "${root_type}.${package_type}.${components}" suffix)
      cccl_add_compile_test(
        test_name
        cccl.test.cmake
        test_export
        "${suffix}"
        ${cmake_opts}
        "-DCCCL_ROOT=${cccl_root}"
        "-DCOMPONENTS=${components}"
        "-DPACKAGE_TYPE=${package_type}"
        "-DCCCL_ENABLE_UNSTABLE=${CCCL_ENABLE_UNSTABLE}"
      )

      if (root_type STREQUAL "INSTALL")
        set_tests_properties(
          ${test_name}
          PROPERTIES FIXTURES_REQUIRED install_tree
        )
      endif()
    endforeach() # package_type
  endforeach() # components
endforeach() # root_type

################################################################################
# Install tree fixtures
add_test(
  NAME cccl.test.cmake.install_tree.install
  # gersemi: off
  COMMAND
    "${CMAKE_COMMAND}"
      --install "${CCCL_BINARY_DIR}"
      --prefix "${tmp_install_prefix}"
  # gersemi: on
)
set_tests_properties(
  cccl.test.cmake.install_tree.install
  PROPERTIES FIXTURES_SETUP install_tree
)

add_test(
  NAME cccl.test.cmake.install_tree.cleanup
  COMMAND "${CMAKE_COMMAND}" -E rm -rf "${tmp_install_prefix}"
)
set_tests_properties(
  cccl.test.cmake.install_tree.cleanup
  PROPERTIES FIXTURES_CLEANUP install_tree
)
