# 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
  )

#
# 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(
      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
      )

    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
      )

    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()

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

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

    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
      )

    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
      )

    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()



# 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}"
  )
