INCLUDE (ScreamUtils)

SET (NEED_LIBS shoc physics_share scream_share)
SET (SK_NEED_LIBS shoc_sk physics_share scream_share)
set(SHOC_TESTS_SRCS
    shoc_tests.cpp
    shoc_grid_tests.cpp
    shoc_diag_obklen_tests.cpp
    shoc_impli_comp_tmpi_tests.cpp
    shoc_impli_dp_inverse_tests.cpp
    shoc_impli_sfc_fluxes_tests.cpp
    shoc_impli_srf_stress_tests.cpp
    shoc_impli_srf_tke_tests.cpp
    shoc_vertflux_tests.cpp
    shoc_varorcovar_tests.cpp
    shoc_energy_fixer_tests.cpp
    shoc_energy_update_dse_tests.cpp
    shoc_energy_integral_tests.cpp
    shoc_energy_total_fixer_tests.cpp
    shoc_energy_dse_fixer_tests.cpp
    shoc_energy_threshold_fixer_tests.cpp
    shoc_length_tests.cpp
    shoc_brunt_length_tests.cpp
    shoc_l_inf_length_tests.cpp
    shoc_check_length_tests.cpp
    shoc_mix_length_tests.cpp
    shoc_fterm_input_third_moms_tests.cpp
    shoc_fterm_diag_third_moms_tests.cpp
    shoc_omega_diag_third_moms_tests.cpp
    shoc_xy_diag_third_moms_tests.cpp
    shoc_aa_diag_third_moms_tests.cpp
    shoc_w3_diag_third_moms_tests.cpp
    shoc_clip_third_moms_tests.cpp
    shoc_tke_tests.cpp
    shoc_check_tke_tests.cpp
    shoc_tke_column_stab_tests.cpp
    shoc_tke_shr_prod_tests.cpp
    shoc_tke_isotropic_ts_tests.cpp
    shoc_tke_adv_sgs_tke_tests.cpp
    shoc_eddy_diffusivities_tests.cpp
    shoc_diag_second_mom_srf_test.cpp
    shoc_linear_interp_tests.cpp
    shoc_diag_third_tests.cpp
    shoc_compute_diag_third_tests.cpp
    shoc_assumed_pdf_tests.cpp
    shoc_pdf_tildetoreal_tests.cpp
    shoc_pdf_vv_parameters_tests.cpp
    shoc_pdf_thl_parameters_tests.cpp
    shoc_pdf_qw_parameters_tests.cpp
    shoc_pdf_inplume_corr_tests.cpp
    shoc_pdf_computetemp_tests.cpp
    shoc_pdf_compute_qs_tests.cpp
    shoc_pdf_compute_s_tests.cpp
    shoc_pdf_compute_buoyflux_tests.cpp
    shoc_pdf_compute_liqflux_tests.cpp
    shoc_pdf_compute_cloudvar_tests.cpp
    shoc_pdf_compute_sgsliq_tests.cpp
    shoc_diag_second_mom_ubycond_test.cpp
    shoc_pblintd_init_pot_test.cpp
    shoc_unit_tests.cpp
    shoc_diag_second_moments_lbycond_tests.cpp
    shoc_diag_second_moments_tests.cpp
    shoc_diag_second_shoc_moments_tests.cpp
    shoc_pblintd_cldcheck_tests.cpp
    shoc_compute_shoc_vapor_tests.cpp
    shoc_update_prognostics_implicit_tests.cpp
    shoc_main_tests.cpp
    shoc_pblintd_height_tests.cpp
    shoc_vd_shoc_decomp_and_solve_tests.cpp
    shoc_pblintd_surf_temp_tests.cpp
    shoc_pblintd_check_pblh_tests.cpp
    shoc_pblintd_tests.cpp
    ) # SHOC_TESTS_SRCS

# NOTE: tests inside this if statement won't be built in a baselines-only build
if (NOT SCREAM_BASELINES_ONLY)
  CreateUnitTest(shoc_tests    "${SHOC_TESTS_SRCS}" "${NEED_LIBS}"    THREADS 1 ${SCREAM_TEST_MAX_THREADS} ${SCREAM_TEST_THREAD_INC} DEP shoc_tests_ut_np1_omp1)
  if (NOT SCREAM_SMALL_KERNELS)
    CreateUnitTest(shoc_sk_tests "${SHOC_TESTS_SRCS}" "${SK_NEED_LIBS}" THREADS 1 ${SCREAM_TEST_MAX_THREADS} ${SCREAM_TEST_THREAD_INC} DEP shoc_tests_ut_np1_omp1 EXE_ARGS shoc_main_bfb)
  endif()
endif()

if (SCREAM_ENABLE_BASELINE_TESTS)
  set(BASELINE_FILE_ARG "-b ${SCREAM_TEST_DATA_DIR}/shoc_run_and_cmp.baseline")

  CreateUnitTestExec(shoc_run_and_cmp "shoc_run_and_cmp.cpp" "${NEED_LIBS}"
                     EXCLUDE_MAIN_CPP)

  CreateUnitTestFromExec(shoc_run_and_cmp_cxx shoc_run_and_cmp
                 THREADS ${SCREAM_TEST_MAX_THREADS}
                 EXE_ARGS "${BASELINE_FILE_ARG}"
                 LABELS "shoc;physics")

  CreateUnitTestFromExec(shoc_run_and_cmp_f90 shoc_run_and_cmp
                 THREADS ${SCREAM_TEST_MAX_THREADS}
                 EXE_ARGS "-f ${BASELINE_FILE_ARG}"
                 LABELS "shoc;physics")

  #
  # Use fake tests to generate shell commands to generate baselines
  #
  CreateUnitTestFromExec(shoc_baseline_f90_fake shoc_run_and_cmp
    THREADS ${SCREAM_TEST_MAX_THREADS}
    EXE_ARGS "-f -g ${BASELINE_FILE_ARG}"
    PROPERTIES DISABLED True)

  CreateUnitTestFromExec(shoc_baseline_cxx_fake shoc_run_and_cmp
    THREADS ${SCREAM_TEST_MAX_THREADS}
    EXE_ARGS "-g ${BASELINE_FILE_ARG}"
    PROPERTIES DISABLED True)

  if (SCREAM_TEST_MAX_THREADS GREATER 1)
    get_test_property(shoc_baseline_f90_fake_omp${SCREAM_TEST_MAX_THREADS} FULL_TEST_COMMAND SHOC_F90_GEN)
    get_test_property(shoc_baseline_cxx_fake_omp${SCREAM_TEST_MAX_THREADS} FULL_TEST_COMMAND SHOC_CXX_GEN)
  else()
    get_test_property(shoc_baseline_f90_fake FULL_TEST_COMMAND SHOC_F90_GEN)
    get_test_property(shoc_baseline_cxx_fake FULL_TEST_COMMAND SHOC_CXX_GEN)
  endif()

  if (SHOC_F90_GEN STREQUAL "NOTFOUND")
    message(FATAL_ERROR "Could not get FULL_TEST_COMMAND for shoc_baseline fake test")
  endif()

  separate_arguments(SHOC_F90_GEN_ARGS UNIX_COMMAND "${SHOC_F90_GEN}")
  separate_arguments(SHOC_CXX_GEN_ARGS UNIX_COMMAND "${SHOC_CXX_GEN}")

  add_custom_target(shoc_baseline_f90
    COMMAND ${CMAKE_COMMAND} -E env OMP_NUM_THREADS=${SCREAM_TEST_MAX_THREADS} ${SHOC_F90_GEN_ARGS})

  add_custom_target(shoc_baseline_cxx
    COMMAND ${CMAKE_COMMAND} -E env OMP_NUM_THREADS=${SCREAM_TEST_MAX_THREADS} ${SHOC_CXX_GEN_ARGS})

  # By default, baselines should be created using all fortran (make baseline). If the user wants
  # to use CXX to generate their baselines, they should use "make baseline_cxx".
  add_dependencies(baseline     shoc_baseline_f90)
  add_dependencies(baseline_cxx shoc_baseline_cxx)
endif()
