# Copyright 2020 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# iree_add_installed_test()
#
# Creates a build-time and exported install-time test. All tests are installed
# into the tests/ tree. Calling code must arrange to install dependencies of the
# test into that tree.
#
# Parameters:
# TEST_NAME: Name of the test (as in "some/path/to/test").
# COMMAND: Passed to add_test() as is.
# ENVIRONMENT: Set as the ENVIRONMENT property of the build-time test.
# INSTALLED_COMMAND: Corrollary to the 'COMMAND' argument but added to the
#   install time definition.
# WORKING_DIRECTORY: Passed to add_test() as is. Note that in the install tree
# all tests run in the tests/ directory.
# LABELS: Labels to pass to add_test() and installed tests.
function(iree_add_installed_test)
  cmake_parse_arguments(
    _RULE
    ""
    "TEST_NAME"
    "COMMAND;ENVIRONMENT;INSTALLED_COMMAND;WORKING_DIRECTORY;LABELS"
    ${ARGN}
  )


  add_test(
    NAME
      ${_RULE_TEST_NAME}
    COMMAND
      ${_RULE_COMMAND}
  )
  if (DEFINED _RULE_WORKING_DIRECTORY)
    set_property(
      TEST
        ${_RULE_TEST_NAME}
      PROPERTY WORKING_DIRECTORY
        "${_RULE_WORKING_DIRECTORY}"
    )
  endif()
  set_property(
    TEST
      ${_RULE_TEST_NAME}
    PROPERTY LABELS
      "${_RULE_LABELS}"
  )
  set_property(
    TEST
      ${_RULE_TEST_NAME}
    PROPERTY ENVIRONMENT
      "TEST_TMPDIR=${CMAKE_BINARY_DIR}/${_RULE_TEST_NAME}_test_tmpdir"
      ${_RULE_ENVIRONMENT}
  )
  iree_add_test_environment_properties(${_RULE_TEST_NAME})

  # Write the to the installed ctest file template.
  set(_installed_ctest_input_file
        "${CMAKE_BINARY_DIR}/iree_installed_tests.cmake.in")
  get_property(_has_tests GLOBAL PROPERTY IREE_HAS_INSTALLED_TESTS)
  if(NOT _has_tests)
    # First time.
    file(WRITE "${_installed_ctest_input_file}")  # Truncate.
    set_property(GLOBAL PROPERTY IREE_HAS_INSTALLED_TESTS ON)
  endif()

  # Now write directives to the installed tests cmake file.
  file(APPEND "${_installed_ctest_input_file}"
    "add_test(${_RULE_TEST_NAME} ${_RULE_INSTALLED_COMMAND})\n"
    "set_tests_properties(${_RULE_TEST_NAME} PROPERTIES LABELS \"${_RULE_LABELS}\")\n"
  )

  # First time generation and setup to install. Note that since this all runs
  # at the generate phase, it doesn't matter that we trigger it before all
  # tests accumulate.
  if(NOT _has_tests)
    set(_installed_ctest_output_file "${CMAKE_BINARY_DIR}/iree_installed_tests.cmake")
    file(GENERATE
      OUTPUT "${_installed_ctest_output_file}"
      INPUT "${_installed_ctest_input_file}"
    )
    install(FILES "${_installed_ctest_output_file}"
      DESTINATION tests
      RENAME "CTestTestfile.cmake"
      COMPONENT Tests
    )
  endif()
endfunction()
