summaryrefslogtreecommitdiff
path: root/neozip/test/cmake/run-and-compare.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'neozip/test/cmake/run-and-compare.cmake')
-rw-r--r--neozip/test/cmake/run-and-compare.cmake72
1 files changed, 72 insertions, 0 deletions
diff --git a/neozip/test/cmake/run-and-compare.cmake b/neozip/test/cmake/run-and-compare.cmake
new file mode 100644
index 0000000000..eb2218dcb5
--- /dev/null
+++ b/neozip/test/cmake/run-and-compare.cmake
@@ -0,0 +1,72 @@
+# run-and-compare.cmake -- Runs a command and compares its output to an expected value
+
+# Copyright (C) 2021 Nathan Moinvaziri
+# Licensed under the Zlib license, see LICENSE.md for details
+
+# Required Variables
+# COMMAND - Command to run
+# OUTPUT - Standard output
+# COMPARE - String to compare output against
+
+# Optional Variables
+# INPUT - Standard input
+# IGNORE_LINE_ENDINGS - Ignore line endings when comparing output
+
+if(NOT DEFINED OUTPUT OR NOT DEFINED COMPARE OR NOT DEFINED COMMAND)
+ message(FATAL_ERROR "Run and compare arguments missing")
+endif()
+
+# Ensure directory exists for output files
+get_filename_component(OUTPUT_DIR "${OUTPUT}" DIRECTORY)
+file(MAKE_DIRECTORY "${OUTPUT_DIR}")
+
+if(INPUT)
+ # Run command with stdin input and redirect stdout to output
+ execute_process(COMMAND ${CMAKE_COMMAND}
+ "-DCOMMAND=${COMMAND}"
+ -DINPUT=${INPUT}
+ -DOUTPUT=${OUTPUT}
+ "-DSUCCESS_EXIT=${SUCCESS_EXIT}"
+ -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake
+ RESULT_VARIABLE CMD_RESULT)
+else()
+ # Run command and redirect stdout to output
+ execute_process(COMMAND ${CMAKE_COMMAND}
+ "-DCOMMAND=${COMMAND}"
+ -DOUTPUT=${OUTPUT}
+ "-DSUCCESS_EXIT=${SUCCESS_EXIT}"
+ -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake
+ RESULT_VARIABLE CMD_RESULT)
+endif()
+
+if(CMD_RESULT)
+ message(FATAL_ERROR "Run before compare failed: ${CMD_RESULT}")
+endif()
+
+# Use configure_file to normalize line-endings
+if(IGNORE_LINE_ENDINGS)
+ # Rewrite files with normalized line endings to temporary directory
+ get_filename_component(COMPARE_NAME ${COMPARE} NAME)
+ set(COMPARE_TEMP ${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/${COMPARE_NAME}.cmp)
+ configure_file(${COMPARE} ${COMPARE_TEMP} NEWLINE_STYLE LF)
+ set(COMPARE ${COMPARE_TEMP})
+
+ get_filename_component(OUTPUT_NAME ${OUTPUT} NAME)
+ set(OUTPUT_TEMP ${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/${OUTPUT_NAME}.cmp)
+ configure_file(${OUTPUT} ${OUTPUT_TEMP} NEWLINE_STYLE LF)
+ set(OUTPUT ${OUTPUT_TEMP})
+endif()
+
+# Compare that output is equal to specified file
+execute_process(COMMAND ${CMAKE_COMMAND}
+ -E compare_files ${COMPARE} ${OUTPUT}
+ RESULT_VARIABLE CMD_RESULT)
+
+# Delete temporary files used to normalize line-endings
+if(IGNORE_LINE_ENDINGS)
+ file(REMOVE ${COMPARE} ${OUTPUT})
+endif()
+
+if(CMD_RESULT)
+ message(FATAL_ERROR "Run compare failed: ${CMD_RESULT}")
+endif()