cmake_minimum_required(VERSION 3.10)
project(RerunRccDepends)
include("../AutogenCoreTest.cmake")

# Tests rcc rebuilding when a resource file changes
# When a .qrc or a file listed in a .qrc file changes,
# the target must be rebuilt

# Dummy executable to generate a clean target
add_executable(dummy dummy.cpp)

# Utility variables
set(timeformat "%Y.%j.%H.%M%S")
set(rccDepSD "${CMAKE_CURRENT_SOURCE_DIR}/RccDepends")
set(rccDepBD "${CMAKE_CURRENT_BINARY_DIR}/RccDepends")

# Utility macros
macro(sleep)
  message(STATUS "Sleeping for a few seconds.")
  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
endmacro()

macro(acquire_timestamps When)
  file(TIMESTAMP "${rccDepBinPlain}" rdPlain${When} "${timeformat}")
  file(TIMESTAMP "${rccDepBinGenerated}" rdGenerated${When} "${timeformat}")
endmacro()

macro(rebuild buildName)
  message(STATUS "Starting build ${buildName} of rccDepends.")
  execute_process(
    COMMAND "${CMAKE_COMMAND}" --build .
    WORKING_DIRECTORY "${rccDepBD}"
    RESULT_VARIABLE result)
  if (result)
    message(FATAL_ERROR "Build ${buildName} of rccDepends failed.")
  else()
    message(STATUS "Build ${buildName} of rccDepends finished.")
  endif()
endmacro()

macro(require_change type)
  if (rd${type}After VERSION_GREATER rd${type}Before)
    message(STATUS "As expected the ${type} .qrc file ${rccDepBin${type}} changed.")
  else()
    message(SEND_ERROR "Unexpectedly the ${type} .qrc file ${rccDepBin${type}} did not change!\nTimestamp pre: ${rd${type}Before}\nTimestamp aft: ${rd${type}After}\n")
  endif()
endmacro()

macro(require_change_not type)
  if (rd${type}After VERSION_GREATER rd${type}Before)
    message(SEND_ERROR "Unexpectedly the ${type} .qrc file ${rccDepBin${type}} changed!\nTimestamp pre: ${rd${type}Before}\nTimestamp aft: ${rd${type}After}\n")
  else()
    message(STATUS "As expected the ${type} .qrc file ${rccDepBin${type}} did not change.")
  endif()
endmacro()


# Initial configuration
configure_file(${rccDepSD}/resPlainA.qrc.in ${rccDepBD}/resPlain.qrc COPYONLY)
configure_file(${rccDepSD}/resGenA.qrc.in ${rccDepBD}/resGen.qrc.in COPYONLY)

# Initial build
try_compile(RCC_DEPENDS
  "${rccDepBD}"
  "${rccDepSD}"
  RccDepends
  CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
              "-DCMAKE_AUTOGEN_VERBOSE=${CMAKE_AUTOGEN_VERBOSE}"
              "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
  OUTPUT_VARIABLE output
)
if (NOT RCC_DEPENDS)
  message(FATAL_ERROR "Initial build of rccDepends failed. Output: ${output}")
endif()

# Get name of the output binaries
file(STRINGS "${rccDepBD}/targetPlain.txt" targetListPlain ENCODING UTF-8)
file(STRINGS "${rccDepBD}/targetGen.txt" targetListGen ENCODING UTF-8)
list(GET targetListPlain 0 rccDepBinPlain)
list(GET targetListGen 0 rccDepBinGenerated)
message(STATUS "Target that uses a plain .qrc file is:\n  ${rccDepBinPlain}")
message(STATUS "Target that uses a GENERATED .qrc file is:\n  ${rccDepBinGenerated}")

# To avoid a race condition where the binary has the same timestamp
# as a source file and therefore gets rebuild
# - sleep to ensure a timestamp change
# - touch binary to ensure it has a new timestamp
acquire_timestamps(Before)
sleep()
message(STATUS "Touching binary files to ensure new timestamps")
file(TOUCH_NOCREATE "${rccDepBinPlain}" "${rccDepBinGenerated}")
acquire_timestamps(After)
require_change(Plain)
require_change(Generated)


# - Ensure that the timestamp will change
# - Change a resource files listed in the .qrc file
# - Rebuild
acquire_timestamps(Before)
sleep()
message(STATUS "Changing a resource file listed in the .qrc file")
file(TOUCH "${rccDepBD}/resPlain/input.txt" "${rccDepBD}/resGen/input.txt")
sleep()
rebuild(2)
acquire_timestamps(After)
# - Test if timestamps changed
require_change(Plain)
require_change(Generated)


# - Ensure that the timestamp will change
# - Change the .qrc file
# - Rebuild
acquire_timestamps(Before)
sleep()
message(STATUS "Changing the .qrc file")
configure_file(${rccDepSD}/resPlainB.qrc.in ${rccDepBD}/resPlain.qrc COPYONLY)
configure_file(${rccDepSD}/resGenB.qrc.in ${rccDepBD}/resGen.qrc.in COPYONLY)
sleep()
rebuild(3)
acquire_timestamps(After)
# - Test if timestamps changed
require_change(Plain)
require_change(Generated)


# - Ensure that the timestamp will change
# - Change a newly added resource files listed in the .qrc file
# - Rebuild
acquire_timestamps(Before)
sleep()
message(STATUS "Changing a newly added resource file listed in the .qrc file")
file(TOUCH "${rccDepBD}/resPlain/inputAdded.txt" "${rccDepBD}/resGen/inputAdded.txt")
sleep()
rebuild(4)
acquire_timestamps(After)
# - Test if timestamps changed
require_change(Plain)
require_change(Generated)


# - Ensure that the timestamp will change
# - Change nothing
# - Rebuild
acquire_timestamps(Before)
sleep()
message(STATUS "Changing nothing in the .qrc file")
rebuild(5)
acquire_timestamps(After)
# - Test if timestamps changed
require_change_not(Plain)
require_change_not(Generated)
