# Ensure that these cmake boolean variables are defined
ASSERT_DEFINED(
  ${PACKAGE_NAME}_ENABLE_Amesos
  ${PACKAGE_NAME}_ENABLE_Amesos2
  ${PACKAGE_NAME}_ENABLE_Belos
  ${PACKAGE_NAME}_ENABLE_Epetra
  ${PACKAGE_NAME}_ENABLE_Zoltan2Core
)

#
# Executable
#

#TODO: how to remove that?
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../src)
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../src/Transfers)
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../src/Smoothers)
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../gallery)
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../unit_tests)

TRIBITS_ADD_EXECUTABLE(
  ParameterListInterpreter
  SOURCES ParameterListInterpreter.cpp ../unit_tests/MueLu_TestHelpers.cpp
  COMM serial mpi
)

TRIBITS_ADD_EXECUTABLE(
  CreateOperator
  SOURCES CreateOperator.cpp ../unit_tests/MueLu_TestHelpers.cpp
  COMM serial mpi
)

#
# Tests
#

# Run the ParameterListInterpreter test with a single thread to avoid non-deterministic behavior
SET(${PACKAGE_NAME}_PARAMETERLISTINTERPRETERTEST_SINGLETHREAD " --kokkos-num-threads=1")

# Test that demangling is enabled, otherwise the test would fail even is they are logically correct.
# NOTE:
# A the moment, the test environment for Trilinos on software is set incorrectly, and
# results in not setting the value correctly.
IF((HAVE_GCC_ABI_DEMANGLE STREQUAL "1") OR (HAVE_GCC_ABI_DEMANGLE STREQUAL "ON"))

  IF(${PACKAGE_NAME}_ENABLE_Epetra
     AND ${PACKAGE_NAME}_ENABLE_EpetraExt
     AND ${PACKAGE_NAME}_ENABLE_Ifpack
     AND ${PACKAGE_NAME}_ENABLE_Amesos
     AND HAVE_MUELU_INST_DOUBLE_INT_INT
  )

    STRING(CONCAT TEST_ARGS "--linAlgebra=Epetra" "${${PACKAGE_NAME}_PARAMETERLISTINTERPRETERTEST_SINGLETHREAD}")

    TRIBITS_ADD_TEST(
      CreateOperator
      NAME "CreateOperatorEpetra"
      ARGS ${TEST_ARGS}
      STANDARD_PASS_OUTPUT
      NUM_MPI_PROCS 1
      COMM mpi serial
    )
    TRIBITS_ADD_TEST(
      CreateOperator
      NAME "CreateOperatorEpetra"
      ARGS ${TEST_ARGS}
      STANDARD_PASS_OUTPUT
      NUM_MPI_PROCS 4
      COMM mpi
    )

    IF(${PACKAGE_NAME}_ENABLE_Zoltan2Core)

      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterEpetra"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 1
        COMM mpi serial
      )
      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterEpetra"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 4
        COMM mpi
      )

      STRING(CONCAT TEST_ARGS "--linAlgebra=Epetra --heavytests" "${${PACKAGE_NAME}_PARAMETERLISTINTERPRETERTEST_SINGLETHREAD}")

      # This test only runs on the dashboard, not at checkin.
      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterEpetraHeavy"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 1
        COMM mpi serial
        CATEGORIES CONTINUOUS
      )

      # This test only runs on the dashboard, not at checkin.
      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterEpetraHeavy"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 4
        COMM mpi
        CATEGORIES CONTINUOUS
      )

    ENDIF()

  ENDIF()

  IF(${PACKAGE_NAME}_ENABLE_Ifpack2 AND ${PACKAGE_NAME}_ENABLE_Amesos2)

    STRING(CONCAT TEST_ARGS "--linAlgebra=Tpetra" "${${PACKAGE_NAME}_PARAMETERLISTINTERPRETERTEST_SINGLETHREAD}")

    TRIBITS_ADD_TEST(
      CreateOperator
      NAME "CreateOperatorTpetra"
      ARGS ${TEST_ARGS}
      STANDARD_PASS_OUTPUT
      NUM_MPI_PROCS 1
      COMM mpi serial
    )
    TRIBITS_ADD_TEST(
      CreateOperator
      NAME "CreateOperatorTpetra"
      ARGS ${TEST_ARGS}
      STANDARD_PASS_OUTPUT
      NUM_MPI_PROCS 4
      COMM mpi
    )

    IF(${PACKAGE_NAME}_ENABLE_Zoltan2Core)

      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterTpetra"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 1
        COMM mpi serial
      )
      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterTpetra"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 4
        COMM mpi
      )

      STRING(CONCAT TEST_ARGS "--linAlgebra=Tpetra --heavytests" "${${PACKAGE_NAME}_PARAMETERLISTINTERPRETERTEST_SINGLETHREAD}")

      # This test only runs on the dashboard, not at checkin.
      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterTpetraHeavy"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 1
        COMM mpi serial
        CATEGORIES CONTINUOUS
      )

      # This test only runs on the dashboard, not at checkin.
      TRIBITS_ADD_TEST(
        ParameterListInterpreter
        NAME "ParameterListInterpreterTpetraHeavy"
        ARGS ${TEST_ARGS}
        STANDARD_PASS_OUTPUT
        NUM_MPI_PROCS 4
        COMM mpi
        CATEGORIES CONTINUOUS
      )

    ENDIF()

  ENDIF()

ENDIF()

# Select appropriate set of input and gold files, add make target for rebase.
FILE(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/default)
ADD_SUBDIRECTORY(default)

FILE(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/kokkos)
ADD_SUBDIRECTORY(kokkos)

TRIBITS_COPY_FILES_TO_BINARY_DIR(rebase_cp SOURCE_FILES rebase.sh)

ADD_CUSTOM_TARGET(rebase COMMAND ./rebase.sh "${CMAKE_CURRENT_SOURCE_DIR}")
