function(add_invalidation_test TEST_NAME)
  set(options)
  set(oneValueArgs STEP INPUT PIPELINE INVALIDATIONS)
  set(multiValueArgs TARGETS)
  cmake_parse_arguments(OPT "${options}" "${oneValueArgs}" "${multiValueArgs}"
                        "${ARGN}")

  add_test(
    NAME "${TEST_NAME}"
    COMMAND
      bash -c "rm -rf ${CMAKE_BINARY_DIR}/${TEST_NAME} &&
      mkdir ${CMAKE_BINARY_DIR}/${TEST_NAME} &&
      ${CMAKE_BINARY_DIR}/libexec/revng/revng-pipeline \
      -P ${OPT_PIPELINE} \
      ${OPT_TARGETS} \
      -i begin:Strings1:${OPT_INPUT} \
      -l ${CMAKE_BINARY_DIR}/lib/librevngStringContainerLibrary.so \
      -p ${CMAKE_BINARY_DIR}/${TEST_NAME} \
      --step ${OPT_STEP} &&
      ${CMAKE_BINARY_DIR}/libexec/revng/revng-invalidate \
      -P ${OPT_PIPELINE} \
      ${OPT_INVALIDATIONS} \
      -l ${CMAKE_BINARY_DIR}/lib/librevngStringContainerLibrary.so \
      -p ${CMAKE_BINARY_DIR}/${TEST_NAME} \
      --step ${OPT_STEP}")
  set_tests_properties(
    "${TEST_NAME}" PROPERTIES LABELS "pipeline;run" ENVIRONMENT
                              "PATH=${CMAKE_BINARY_DIR}/bin:$ENV{PATH}")
endfunction()

add_invalidation_test(
  simple_invalidation_test
  TARGETS
  "Strings2:Root:StringKind"
  STEP
  "FirstStep"
  INPUT
  "${CMAKE_CURRENT_SOURCE_DIR}/InvalidateTestInput.txt"
  PIPELINE
  "${CMAKE_CURRENT_SOURCE_DIR}/SimpleInvalidationTestPipeline.yml"
  INVALIDATIONS
  "Strings1:Root:StringKind")
