瀏覽代碼

ENH: Adding test for non-trivial custom command line arguments. This is for bug#3786.

Brad King 19 年之前
父節點
當前提交
ca22f0f14b
共有 2 個文件被更改,包括 71 次插入0 次删除
  1. 39 0
      Tests/CustomCommand/CMakeLists.txt
  2. 32 0
      Tests/CustomCommand/check_command_line.c.in

+ 39 - 0
Tests/CustomCommand/CMakeLists.txt

@@ -164,3 +164,42 @@ TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
 # the CustomCommand executable really needs doc1.h
 ADD_DEPENDENCIES(CustomCommand TDocument)
 
+##############################################################################
+# Test non-trivial command line arguments in custom commands.
+SET(EXPECTED_ARGUMENTS)
+SET(CHECK_ARGS
+  c:/posix/path
+  c:\\windows\\path
+  'single-quotes'
+  single'quote
+  \"double-quotes\"
+  double\"quote
+  "\\;semi-colons\\;"
+  "semi\\;colon"
+  "c:/posix/path/with space"
+  "c:\\windows\\path\\with space"
+  "'single quotes with space'"
+  "single'quote with space"
+  "\"double-quotes with space\""
+  "double\"quote with space"
+  "\\;semi-colons with space\\;"
+  "semi\\;colon with space"
+  )
+FOREACH(arg ${CHECK_ARGS})
+  SET(ARG "${arg}")
+  STRING(REGEX REPLACE "\\\\" "\\\\\\\\" ARG "${ARG}")
+  STRING(REGEX REPLACE "\"" "\\\\\"" ARG "${ARG}")
+  SET(EXPECTED_ARGUMENTS
+    "${EXPECTED_ARGUMENTS}  \"${ARG}\",
+")
+ENDFOREACH(arg)
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/check_command_line.c.in
+               ${CMAKE_CURRENT_BINARY_DIR}/check_command_line.c
+               @ONLY IMMEDIATE)
+ADD_EXECUTABLE(check_command_line
+  ${CMAKE_CURRENT_BINARY_DIR}/check_command_line.c)
+ADD_CUSTOM_TARGET(do_check_command_line ALL
+  COMMAND ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/check_command_line
+  ${CHECK_ARGS}
+  )
+ADD_DEPENDENCIES(do_check_command_line check_command_line)

+ 32 - 0
Tests/CustomCommand/check_command_line.c.in

@@ -0,0 +1,32 @@
+#include <stdio.h>
+
+const char* expected_arguments[] =
+{
+@EXPECTED_ARGUMENTS@  0
+};
+
+int main(int argc, const char* argv[])
+{
+  const char** a = argv+1;
+  const char** e = expected_arguments;
+  (void)argc;
+  for(;*a && *e; ++a, ++e)
+    {
+    if(strcmp(*a, *e) != 0)
+      {
+      fprintf(stderr, "Argument [%s] does not match expected [%s].\n",
+              *a, *e);
+      return 1;
+      }
+    else
+      {
+      printf("[%s]\n", *a);
+      }
+    }
+  if(*a || *e)
+    {
+    fprintf(stderr, "Number of arguments does not match expected.\n");
+    return 1;
+    }
+  return 0;
+}