# Matlab (and Python) don't have an easy way to specify
# test dependencies between test code files.
# Hence, we use a CMake project to specify depedencies and run tests in parallel.

cmake_minimum_required(VERSION 3.20)

file(READ ${CMAKE_CURRENT_LIST_DIR}/codemeta.json _libj)
string(JSON PROJECT_VERSION GET ${_libj} version)

project(MatGemini
LANGUAGES NONE
VERSION ${PROJECT_VERSION}
)

enable_testing()

include(cmake/options.cmake)

set(tmod gemini3d.test.Test)

find_package(Matlab COMPONENTS MAIN_PROGRAM REQUIRED)
if(Matlab_VERSION_STRING AND Matlab_VERSION_STRING VERSION_LESS 9.9)
  message(STATUS "Matlab >= 9.9 required, found ${Matlab_VERSION_STRING}")
endif()

# -- setup Gemini3D program
# For repeatability, build MatGemini Gemini3D binaries under mat_gemini/build

include(cmake/gemini3d.cmake)

# -- MatGemini testing

cmake_path(SET setup_m ${CMAKE_CURRENT_SOURCE_DIR}/setup.m)

add_test(NAME Lint
COMMAND ${Matlab_MAIN_PROGRAM} -batch "r=runtests('${tmod}Lint'); assert(~isempty(r)), assertSuccess(r)"
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
set_tests_properties(Lint PROPERTIES
TIMEOUT 120
FIXTURES_SETUP lint_fxt
)

# --- unit tests

set(unit_tests Unit Grid)

foreach(n ${unit_tests})

  add_test(NAME ${n}
  COMMAND ${Matlab_MAIN_PROGRAM} -batch "r=runtests('${tmod}${n}'); assert(~isempty(r)), assertSuccess(r)"
  WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
  )

endforeach()

# --- MSIS tests

add_test(NAME MSIS
COMMAND ${Matlab_MAIN_PROGRAM} -batch "run('${setup_m}'), r=runtests('${tmod}MSIS'); assert(~isempty(r)), assertSuccess(r)"
)

set_tests_properties(${unit_tests} MSIS PROPERTIES
TIMEOUT 120
REQUIRED_FILES ${setup_m}
FIXTURES_REQUIRED lint_fxt
FIXTURES_SETUP unit_fxt
)
set_tests_properties(MSIS PROPERTIES
ENVIRONMENT "GEMINI_ROOT=${GEMINI_ROOT}"
)

# --- data download tests

add_test(NAME DataIO
COMMAND ${Matlab_MAIN_PROGRAM} -batch "run('${setup_m}'), r=runtests('${tmod}DataIO'); assert(~isempty(r)), assertSuccess(r)"
)

set_tests_properties(DataIO PROPERTIES
TIMEOUT 120
REQUIRED_FILES ${setup_m}
FIXTURES_REQUIRED unit_fxt
FIXTURES_SETUP io_fxt
)

# --- integration tests

add_test(NAME Dryrun
COMMAND ${Matlab_MAIN_PROGRAM} -batch "run('${setup_m}'), r=runtests('${tmod}Dryrun'); assert(~isempty(r)), assertSuccess(r)"
)
set_tests_properties(Dryrun PROPERTIES
TIMEOUT 240
REQUIRED_FILES ${setup_m}
FIXTURES_REQUIRED io_fxt
FIXTURES_SETUP dryrun_fxt
ENVIRONMENT "GEMINI_ROOT=${GEMINI_ROOT}"
)

add_test(NAME Project
COMMAND ${Matlab_MAIN_PROGRAM} -batch "run('${setup_m}'), r=runtests('${tmod}Project'); assert(~isempty(r)), assertSuccess(r)"
)
set_tests_properties(Project PROPERTIES
TIMEOUT 240
REQUIRED_FILES ${setup_m}
FIXTURES_REQUIRED dryrun_fxt
ENVIRONMENT "GEMINI_ROOT=${GEMINI_ROOT}"
)