浏览代码

add_test: Allow special characters in test name

Fixes: #19391
Deniz Bahadir 5 年之前
父节点
当前提交
f84af8e270
共有 58 个文件被更改,包括 383 次插入15 次删除
  1. 3 2
      Help/command/add_test.rst
  2. 7 7
      Source/cmTestGenerator.cxx
  3. 1 1
      Tests/RunCMake/AndroidTestUtilities/check.cmake
  4. 1 0
      Tests/RunCMake/CMakeLists.txt
  5. 5 5
      Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake
  6. 27 0
      Tests/RunCMake/add_test/CMakeLists.txt.in
  7. 1 0
      Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt
  8. 1 0
      Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt
  9. 1 0
      Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt
  10. 2 0
      Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt
  11. 1 0
      Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt
  12. 2 0
      Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt
  13. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt
  14. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt
  15. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt
  16. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt
  17. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt
  18. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt
  19. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt
  20. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt
  21. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt
  22. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt
  23. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt
  24. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt
  25. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt
  26. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt
  27. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt
  28. 1 0
      Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt
  29. 1 0
      Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt
  30. 1 0
      Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt
  31. 1 0
      Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt
  32. 1 0
      Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt
  33. 1 0
      Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt
  34. 1 0
      Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt
  35. 1 0
      Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt
  36. 1 0
      Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt
  37. 1 0
      Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt
  38. 1 0
      Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt
  39. 2 0
      Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt
  40. 3 0
      Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt
  41. 1 0
      Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt
  42. 2 0
      Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt
  43. 1 0
      Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt
  44. 1 0
      Tests/RunCMake/add_test/NameContainsSpaces2-result.txt
  45. 2 0
      Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt
  46. 3 0
      Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt
  47. 1 0
      Tests/RunCMake/add_test/NameContainsSpaces4-result.txt
  48. 2 0
      Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt
  49. 1 0
      Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt
  50. 1 0
      Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt
  51. 1 0
      Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt
  52. 1 0
      Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt
  53. 1 0
      Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt
  54. 1 0
      Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt
  55. 1 0
      Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt
  56. 1 0
      Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt
  57. 263 0
      Tests/RunCMake/add_test/RunCMakeTest.cmake
  58. 16 0
      Tests/RunCMake/add_test/test.cmake.in

+ 3 - 2
Help/command/add_test.rst

@@ -10,8 +10,9 @@ Add a test to the project to be run by :manual:`ctest(1)`.
            [WORKING_DIRECTORY <dir>]
            [COMMAND_EXPAND_LISTS])
 
-Adds a test called ``<name>``.  The test name may not contain spaces,
-quotes, or other characters special in CMake syntax.  The options are:
+Adds a test called ``<name>``.  The test name may contain arbitrary
+characters except for double-quotes.  However, if it contains spaces
+or semicolons it must be enclosed in double-quotes.  The options are:
 
 ``COMMAND``
   Specify the test command-line.  If ``<command>`` specifies an

+ 7 - 7
Source/cmTestGenerator.cxx

@@ -76,7 +76,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
   cmGeneratorExpression ge(this->Test->GetBacktrace());
 
   // Start the test command.
-  os << indent << "add_test(" << this->Test->GetName() << " ";
+  os << indent << "add_test(\"" << this->Test->GetName() << "\" ";
 
   // Evaluate command line arguments
   std::vector<std::string> argv =
@@ -126,8 +126,8 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
   os << ")\n";
 
   // Output properties for the test.
-  os << indent << "set_tests_properties(" << this->Test->GetName()
-     << " PROPERTIES ";
+  os << indent << "set_tests_properties(\"" << this->Test->GetName()
+     << "\" PROPERTIES ";
   for (auto const& i : this->Test->GetProperties().GetList()) {
     os << " " << i.first << " "
        << cmOutputConverter::EscapeForCMake(
@@ -139,7 +139,8 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
 
 void cmTestGenerator::GenerateScriptNoConfig(std::ostream& os, Indent indent)
 {
-  os << indent << "add_test(" << this->Test->GetName() << " NOT_AVAILABLE)\n";
+  os << indent << "add_test(\"" << this->Test->GetName()
+     << "\" NOT_AVAILABLE)\n";
 }
 
 bool cmTestGenerator::NeedsScriptNoConfig() const
@@ -159,9 +160,8 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, Indent indent)
 
   std::string exe = command[0];
   cmSystemTools::ConvertToUnixSlashes(exe);
-  fout << indent;
-  fout << "add_test(";
-  fout << this->Test->GetName() << " \"" << exe << "\"";
+  fout << indent << "add_test(\"" << this->Test->GetName() << "\" \"" << exe
+       << "\"";
 
   for (std::string const& arg : cmMakeRange(command).advance(1)) {
     // Just double-quote all arguments so they are re-parsed

+ 1 - 1
Tests/RunCMake/AndroidTestUtilities/check.cmake

@@ -13,7 +13,7 @@ function(compare_build_to_expected)
 endfunction()
 
 function(check_for_setup_test)
-  file(STRINGS "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" output_var REGEX "add_test\\(setup_test.*")
+  file(STRINGS "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" output_var REGEX "add_test\\(\"setup_test\".*")
   if(NOT output_var)
     set(RunCMake_TEST_FAILED "Could not find the test: setup_test" PARENT_SCOPE)
   endif()

+ 1 - 0
Tests/RunCMake/CMakeLists.txt

@@ -272,6 +272,7 @@ add_RunCMake_test(add_dependencies)
 add_RunCMake_test(add_executable)
 add_RunCMake_test(add_library)
 add_RunCMake_test(add_subdirectory)
+add_RunCMake_test(add_test)
 add_RunCMake_test(build_command)
 add_executable(exit_code exit_code.c)
 set(execute_process_ARGS -DEXIT_CODE_EXE=$<TARGET_FILE:exit_code>)

+ 5 - 5
Tests/RunCMake/CrosscompilingEmulator/AddTest-check.cmake

@@ -7,22 +7,22 @@ endif()
 
 set(error_details "There is a problem with generated test file: ${testfile}")
 
-if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulator [^\n]+pseudo_emulator[^\n]+\n")
+if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulator[\"] [^\n]+pseudo_emulator[^\n]+\n")
   message(SEND_ERROR "Used emulator when it should not be used. ${error_details}")
 endif()
 
-if(NOT testfile_contents MATCHES "add_test[(]UsesEmulator [^\n]+pseudo_emulator[^\n]+\n")
+if(NOT testfile_contents MATCHES "add_test[(][\"]UsesEmulator[\"] [^\n]+pseudo_emulator[^\n]+\n")
   message(SEND_ERROR "Did not use emulator when it should be used. ${error_details}")
 endif()
 
-if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulatorWithGenex [^\n]+pseudo_emulator[^\n]+\n")
+if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulatorWithGenex[\"] [^\n]+pseudo_emulator[^\n]+\n")
   message(SEND_ERROR "Used emulator when it should not be used. ${error_details}")
 endif()
 
-if(NOT testfile_contents MATCHES "add_test[(]UsesEmulatorWithExecTargetFromSubdirAddedWithoutGenex [^\n]+pseudo_emulator[^\n]+\n")
+if(NOT testfile_contents MATCHES "add_test[(][\"]UsesEmulatorWithExecTargetFromSubdirAddedWithoutGenex[\"] [^\n]+pseudo_emulator[^\n]+\n")
   message(SEND_ERROR "Did not use emulator when it should be used. ${error_details}")
 endif()
 
-if(testfile_contents MATCHES "add_test[(]DoesNotUseEmulatorWithExecTargetFromSubdirAddedWithGenex [^\n]+pseudo_emulator[^\n]+\n")
+if(testfile_contents MATCHES "add_test[(][\"]DoesNotUseEmulatorWithExecTargetFromSubdirAddedWithGenex[\"] [^\n]+pseudo_emulator[^\n]+\n")
   message(SEND_ERROR "Used emulator when it should not be used. ${error_details}")
 endif()

+ 27 - 0
Tests/RunCMake/add_test/CMakeLists.txt.in

@@ -0,0 +1,27 @@
+if (NOT DEFINED RUN_AS_SCRIPT)
+
+  cmake_minimum_required(VERSION 3.7)
+  project(@CASE_NAME@ NONE)
+  include(CTest)
+
+  # Two fallback tests for set_tests_properties.
+  add_test(NAME PrefixTest COMMAND "${CMAKE_COMMAND}" --version)
+  add_test(NAME SuffixTest COMMAND "${CMAKE_COMMAND}" --version)
+
+  add_test(
+    NAME @CASE_CMAKELISTS_NAME_1@
+    COMMAND "${CMAKE_COMMAND}" -D RUN_AS_SCRIPT=1 -P "${CMAKE_CURRENT_LIST_FILE}"
+  )
+  set_tests_properties(
+    @CASE_CMAKELISTS_NAME_2@
+    PROPERTIES
+      ENVIRONMENT CMAKE_add_test_ENVVAR=1
+  )
+
+else()
+
+  if(NOT DEFINED ENV{CMAKE_add_test_ENVVAR})
+    message(FATAL_ERROR "Setting property on test did not succeed!")
+  endif()
+
+endif()

+ 1 - 0
Tests/RunCMake/add_test/NameContainsBracketArgument1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \[=\[BracketArgument;SuffixTest\]=\] \.+[ ]+Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsBracketArgument2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: BracketArgument;SuffixTest \.+[ ]+Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsBracketArgument3-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 2 - 0
Tests/RunCMake/add_test/NameContainsBracketArgument3-stderr.txt

@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!

+ 1 - 0
Tests/RunCMake/add_test/NameContainsBracketArgument4-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 2 - 0
Tests/RunCMake/add_test/NameContainsBracketArgument4-stderr.txt

@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote1-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote1-stderr.txt

@@ -0,0 +1 @@
+Unable to find executable: SuffixTest

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote2-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote2-stderr.txt

@@ -0,0 +1 @@
+Unable to find executable: SuffixTest

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote3-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote3-stderr.txt

@@ -0,0 +1 @@
+Unable to find executable: SuffixTest

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote3-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote4-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote4-stderr.txt

@@ -0,0 +1 @@
+Unable to find executable: SuffixTest

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedQuote4-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: EscapedQuote \.+\*\*\*Not Run

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedSpecialChars1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedSpecialChars2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedSpecialChars3-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsEscapedSpecialChars4-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \(\) # \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax3-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsGeneratorExpressionSyntax4-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: \$<BOOL:0> \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsOtherSpecialChars1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsOtherSpecialChars2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsOtherSpecialChars3-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsOtherSpecialChars4-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: !§\$%&/ü:\*😤~ \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsSemicolon1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: PrefixTest;SuffixTest \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsSemicolon2-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 2 - 0
Tests/RunCMake/add_test/NameContainsSemicolon2-stderr.txt

@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!

+ 3 - 0
Tests/RunCMake/add_test/NameContainsSemicolon3-stdout.txt

@@ -0,0 +1,3 @@
+3/3 Test #3: PrefixTest;SuffixTest \.+\*\*\*Failed.*
+CMake Error at .+/CMakeLists.txt:[0-9]+ \(message\):
+[ ]*Setting property on test did not succeed!

+ 1 - 0
Tests/RunCMake/add_test/NameContainsSemicolon4-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 2 - 0
Tests/RunCMake/add_test/NameContainsSemicolon4-stderr.txt

@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!

+ 1 - 0
Tests/RunCMake/add_test/NameContainsSpaces1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: PrefixTest SuffixTest \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsSpaces2-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 2 - 0
Tests/RunCMake/add_test/NameContainsSpaces2-stderr.txt

@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!

+ 3 - 0
Tests/RunCMake/add_test/NameContainsSpaces3-stdout.txt

@@ -0,0 +1,3 @@
+3/3 Test #3: PrefixTest SuffixTest \.+\*\*\*Failed.*
+CMake Error at .+/CMakeLists.txt:[0-9]+ \(message\):
+[ ]*Setting property on test did not succeed!

+ 1 - 0
Tests/RunCMake/add_test/NameContainsSpaces4-result.txt

@@ -0,0 +1 @@
+(-1|255)

+ 2 - 0
Tests/RunCMake/add_test/NameContainsSpaces4-stderr.txt

@@ -0,0 +1,2 @@
+Error\(s\) when configuring the project
+No tests were found!!!

+ 1 - 0
Tests/RunCMake/add_test/NameContainsValidSpecialChars1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsValidSpecialChars2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsValidSpecialChars3-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameContainsValidSpecialChars4-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abc_\.\+-012 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameIsAlphaNumeric1-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameIsAlphaNumeric2-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameIsAlphaNumeric3-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed

+ 1 - 0
Tests/RunCMake/add_test/NameIsAlphaNumeric4-stdout.txt

@@ -0,0 +1 @@
+Test #[0-9]+: abcdefghijklmnopqrstuvwxyz0123456789 \.+[ ]*Passed

+ 263 - 0
Tests/RunCMake/add_test/RunCMakeTest.cmake

@@ -0,0 +1,263 @@
+include(RunCTest)
+
+set(ENV{CTEST_OUTPUT_ON_FAILURE} 1)
+
+function(run_NameIsAlphaNumeric1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+  run_ctest(NameIsAlphaNumeric1)
+endfunction()
+run_NameIsAlphaNumeric1_test()
+
+function(run_NameIsAlphaNumeric2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+  run_ctest(NameIsAlphaNumeric2)
+endfunction()
+run_NameIsAlphaNumeric2_test()
+
+function(run_NameIsAlphaNumeric3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+  run_ctest(NameIsAlphaNumeric3)
+endfunction()
+run_NameIsAlphaNumeric3_test()
+
+function(run_NameIsAlphaNumeric4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ abcdefghijklmnopqrstuvwxyz0123456789 ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["abcdefghijklmnopqrstuvwxyz0123456789"]==])
+  run_ctest(NameIsAlphaNumeric4)
+endfunction()
+run_NameIsAlphaNumeric4_test()
+
+
+function(run_NameContainsValidSpecialChars1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ abc_.+-012 ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ abc_.+-012 ]==])
+  run_ctest(NameContainsValidSpecialChars1)
+endfunction()
+run_NameContainsValidSpecialChars1_test()
+
+function(run_NameContainsValidSpecialChars2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["abc_.+-012"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["abc_.+-012"]==])
+  run_ctest(NameContainsValidSpecialChars2)
+endfunction()
+run_NameContainsValidSpecialChars2_test()
+
+function(run_NameContainsValidSpecialChars3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["abc_.+-012"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ abc_.+-012 ]==])
+  run_ctest(NameContainsValidSpecialChars3)
+endfunction()
+run_NameContainsValidSpecialChars3_test()
+
+function(run_NameContainsValidSpecialChars4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ abc_.+-012 ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["abc_.+-012"]==])
+  run_ctest(NameContainsValidSpecialChars4)
+endfunction()
+run_NameContainsValidSpecialChars4_test()
+
+
+function(run_NameContainsOtherSpecialChars1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ !§$%&/ü:*😤~ ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ !§$%&/ü:*😤~ ]==])
+  run_ctest(NameContainsOtherSpecialChars1)
+endfunction()
+run_NameContainsOtherSpecialChars1_test()
+
+function(run_NameContainsOtherSpecialChars2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["!§$%&/ü:*😤~"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["!§$%&/ü:*😤~"]==])
+  run_ctest(NameContainsOtherSpecialChars2)
+endfunction()
+run_NameContainsOtherSpecialChars2_test()
+
+function(run_NameContainsOtherSpecialChars3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["!§$%&/ü:*😤~"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ !§$%&/ü:*😤~ ]==])
+  run_ctest(NameContainsOtherSpecialChars3)
+endfunction()
+run_NameContainsOtherSpecialChars3_test()
+
+function(run_NameContainsOtherSpecialChars4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ !§$%&/ü:*😤~ ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["!§$%&/ü:*😤~"]==])
+  run_ctest(NameContainsOtherSpecialChars4)
+endfunction()
+run_NameContainsOtherSpecialChars4_test()
+
+
+function(run_NameContainsEscapedSpecialChars1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ \(\)\ \# ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ \(\)\ \# ]==])
+  run_ctest(NameContainsEscapedSpecialChars1)
+endfunction()
+run_NameContainsEscapedSpecialChars1_test()
+
+function(run_NameContainsEscapedSpecialChars2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["\(\)\ \#"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["\(\)\ \#"]==])
+  run_ctest(NameContainsEscapedSpecialChars2)
+endfunction()
+run_NameContainsEscapedSpecialChars2_test()
+
+function(run_NameContainsEscapedSpecialChars3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["\(\)\ \#"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ \(\)\ \# ]==])
+  run_ctest(NameContainsEscapedSpecialChars3)
+endfunction()
+run_NameContainsEscapedSpecialChars3_test()
+
+function(run_NameContainsEscapedSpecialChars4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ \(\)\ \# ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["\(\)\ \#"]==])
+  run_ctest(NameContainsEscapedSpecialChars4)
+endfunction()
+run_NameContainsEscapedSpecialChars4_test()
+
+
+function(run_NameContainsGeneratorExpressionSyntax1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ $<BOOL:0> ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ $<BOOL:0> ]==])
+  run_ctest(NameContainsGeneratorExpressionSyntax1)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax1_test()
+
+function(run_NameContainsGeneratorExpressionSyntax2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["$<BOOL:0>"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["$<BOOL:0>"]==])
+  run_ctest(NameContainsGeneratorExpressionSyntax2)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax2_test()
+
+function(run_NameContainsGeneratorExpressionSyntax3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["$<BOOL:0>"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ $<BOOL:0> ]==])
+  run_ctest(NameContainsGeneratorExpressionSyntax3)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax3_test()
+
+function(run_NameContainsGeneratorExpressionSyntax4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ $<BOOL:0> ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["$<BOOL:0>"]==])
+  run_ctest(NameContainsGeneratorExpressionSyntax4)
+endfunction()
+run_NameContainsGeneratorExpressionSyntax4_test()
+
+
+function(run_NameContainsSpaces1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest SuffixTest"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest SuffixTest"]==])
+  run_ctest(NameContainsSpaces1)
+endfunction()
+run_NameContainsSpaces1_test()
+
+function(run_NameContainsSpaces2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest SuffixTest ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest SuffixTest ]==])
+  run_ctest(NameContainsSpaces2)
+endfunction()
+run_NameContainsSpaces2_test()
+
+function(run_NameContainsSpaces3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest SuffixTest"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest SuffixTest ]==])
+  run_ctest(NameContainsSpaces3)
+endfunction()
+run_NameContainsSpaces3_test()
+
+function(run_NameContainsSpaces4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest SuffixTest ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest SuffixTest"]==])
+  run_ctest(NameContainsSpaces4)
+endfunction()
+run_NameContainsSpaces4_test()
+
+
+function(run_NameContainsSemicolon1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest;SuffixTest"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest;SuffixTest"]==])
+  run_ctest(NameContainsSemicolon1)
+endfunction()
+run_NameContainsSemicolon1_test()
+
+function(run_NameContainsSemicolon2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest;SuffixTest ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest;SuffixTest ]==])
+  run_ctest(NameContainsSemicolon2)
+endfunction()
+run_NameContainsSemicolon2_test()
+
+function(run_NameContainsSemicolon3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["PrefixTest;SuffixTest"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ PrefixTest;SuffixTest ]==])
+  run_ctest(NameContainsSemicolon3)
+endfunction()
+run_NameContainsSemicolon3_test()
+
+function(run_NameContainsSemicolon4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ PrefixTest;SuffixTest ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["PrefixTest;SuffixTest"]==])
+  run_ctest(NameContainsSemicolon4)
+endfunction()
+run_NameContainsSemicolon4_test()
+
+
+function(run_NameContainsEscapedQuote1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["EscapedQuote\"\"SuffixTest"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["EscapedQuote\"\"SuffixTest"]==])
+  run_ctest(NameContainsEscapedQuote1)
+endfunction()
+run_NameContainsEscapedQuote1_test()
+
+function(run_NameContainsEscapedQuote2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ EscapedQuote\"\"SuffixTest ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ EscapedQuote\"\"SuffixTest ]==])
+  run_ctest(NameContainsEscapedQuote2)
+endfunction()
+run_NameContainsEscapedQuote2_test()
+
+function(run_NameContainsEscapedQuote3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["EscapedQuote\"\"SuffixTest"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ EscapedQuote\"\"SuffixTest ]==])
+  run_ctest(NameContainsEscapedQuote3)
+endfunction()
+run_NameContainsEscapedQuote3_test()
+
+function(run_NameContainsEscapedQuote4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ EscapedQuote\"\"SuffixTest ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["EscapedQuote\"\"SuffixTest"]==])
+  run_ctest(NameContainsEscapedQuote4)
+endfunction()
+run_NameContainsEscapedQuote4_test()
+
+
+function(run_NameContainsBracketArgument1_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["[=[BracketArgument;SuffixTest]=]"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["[=[BracketArgument;SuffixTest]=]"]==])
+  run_ctest(NameContainsBracketArgument1)
+endfunction()
+run_NameContainsBracketArgument1_test()
+
+function(run_NameContainsBracketArgument2_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+  run_ctest(NameContainsBracketArgument2)
+endfunction()
+run_NameContainsBracketArgument2_test()
+
+function(run_NameContainsBracketArgument3_test)
+  set(CASE_CMAKELISTS_NAME_1 [==["[=[BracketArgument;SuffixTest]=]"]==])
+  set(CASE_CMAKELISTS_NAME_2 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+  run_ctest(NameContainsBracketArgument3)
+endfunction()
+run_NameContainsBracketArgument3_test()
+
+function(run_NameContainsBracketArgument4_test)
+  set(CASE_CMAKELISTS_NAME_1 [==[ [=[BracketArgument;SuffixTest]=] ]==])
+  set(CASE_CMAKELISTS_NAME_2 [==["[=[BracketArgument;SuffixTest]=]"]==])
+  run_ctest(NameContainsBracketArgument4)
+endfunction()
+run_NameContainsBracketArgument4_test()

+ 16 - 0
Tests/RunCMake/add_test/test.cmake.in

@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.17)
+
+set(CTEST_SITE                          "test-site")
+set(CTEST_BUILD_NAME                    "test-build-name")
+set(CTEST_SOURCE_DIRECTORY              "@RunCMake_BINARY_DIR@/@CASE_NAME@")
+set(CTEST_BINARY_DIRECTORY              "@RunCMake_BINARY_DIR@/@CASE_NAME@-build")
+set(CTEST_CMAKE_GENERATOR               "@RunCMake_GENERATOR@")
+set(CTEST_CMAKE_GENERATOR_PLATFORM      "@RunCMake_GENERATOR_PLATFORM@")
+set(CTEST_CMAKE_GENERATOR_TOOLSET       "@RunCMake_GENERATOR_TOOLSET@")
+set(CTEST_BUILD_CONFIGURATION           "$ENV{CMAKE_CONFIG_TYPE}")
+
+set(ctest_test_args "@CASE_CTEST_TEST_ARGS@")
+ctest_start(Experimental)
+ctest_configure()
+#ctest_build()
+ctest_test(${ctest_test_args})