summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/GoogleTestAddTests.cmake68
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt16
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt22
-rw-r--r--Tests/RunCMake/GoogleTest/fake_gtest.cpp4
4 files changed, 94 insertions, 16 deletions
diff --git a/Modules/GoogleTestAddTests.cmake b/Modules/GoogleTestAddTests.cmake
index 1283a3f..7043b2b 100644
--- a/Modules/GoogleTestAddTests.cmake
+++ b/Modules/GoogleTestAddTests.cmake
@@ -20,7 +20,7 @@ macro(flush_tests_buffer)
set(tests_buffer "")
endmacro()
-macro(add_command NAME)
+macro(add_command NAME TEST_NAME)
set(_args "")
foreach(_arg ${ARGN})
if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
@@ -29,7 +29,7 @@ macro(add_command NAME)
string(APPEND _args " ${_arg}")
endif()
endforeach()
- string(APPEND script "${NAME}(${_args})\n")
+ string(APPEND script "${NAME}(${TEST_NAME} ${_args})\n")
string(LENGTH "${script}" _script_len)
if(${_script_len} GREATER "50000")
flush_script()
@@ -39,6 +39,32 @@ macro(add_command NAME)
unset(_script_len)
endmacro()
+function(generate_testname_guards OUTPUT OPEN_GUARD_VAR CLOSE_GUARD_VAR)
+ set(open_guard "[=[")
+ set(close_guard "]=]")
+ set(counter 1)
+ while("${OUTPUT}" MATCHES "${close_guard}")
+ math(EXPR counter "${counter} + 1")
+ string(REPEAT "=" ${counter} equals)
+ set(open_guard "[${equals}[")
+ set(close_guard "]${equals}]")
+ endwhile()
+ set(${OPEN_GUARD_VAR} "${open_guard}" PARENT_SCOPE)
+ set(${CLOSE_GUARD_VAR} "${close_guard}" PARENT_SCOPE)
+endfunction()
+
+function(escape_square_brackets OUTPUT BRACKET PLACEHOLDER PLACEHOLDER_VAR OUTPUT_VAR)
+ if("${OUTPUT}" MATCHES "\\${BRACKET}")
+ set(placeholder "${PLACEHOLDER}")
+ while("${OUTPUT}" MATCHES "${placeholder}")
+ set(placeholder "${placeholder}_")
+ endwhile()
+ string(REPLACE "${BRACKET}" "${placeholder}" OUTPUT "${OUTPUT}")
+ set(${PLACEHOLDER_VAR} "${placeholder}" PARENT_SCOPE)
+ set(${OUTPUT_VAR} "${OUTPUT}" PARENT_SCOPE)
+ endif()
+endfunction()
+
function(gtest_discover_tests_impl)
cmake_parse_arguments(
@@ -94,6 +120,9 @@ function(gtest_discover_tests_impl)
)
endif()
+ generate_testname_guards("${output}" open_guard close_guard)
+ escape_square_brackets("${output}" "[" "__osb" open_sb output)
+ escape_square_brackets("${output}" "]" "__csb" close_sb output)
# Preserve semicolon in test-parameters
string(REPLACE [[;]] [[\;]] output "${output}")
string(REPLACE "\n" ";" output "${output}")
@@ -128,18 +157,24 @@ function(gtest_discover_tests_impl)
unset(TEST_XML_OUTPUT_PARAM)
endif()
- # sanitize test name for further processing downstream
set(testname "${prefix}${pretty_suite}.${pretty_test}${suffix}")
+ # sanitize test name for further processing downstream
+ # unescape []
+ if(open_sb)
+ string(REPLACE "${open_sb}" "[" testname "${testname}")
+ endif()
+ if(close_sb)
+ string(REPLACE "${close_sb}" "]" testname "${testname}")
+ endif()
# escape \
string(REPLACE [[\]] [[\\]] testname "${testname}")
- # escape ;
- string(REPLACE [[;]] [[\;]] testname "${testname}")
# escape $
string(REPLACE [[$]] [[\$]] testname "${testname}")
+ set(guarded_testname "${open_guard}${testname}${close_guard}")
# ...and add to script
add_command(add_test
- "${testname}"
+ "${guarded_testname}"
${_TEST_EXECUTOR}
"${_TEST_EXECUTABLE}"
"--gtest_filter=${suite}.${test}"
@@ -149,21 +184,28 @@ function(gtest_discover_tests_impl)
)
if(suite MATCHES "^DISABLED_" OR test MATCHES "^DISABLED_")
add_command(set_tests_properties
- "${testname}"
+ "${guarded_testname}"
PROPERTIES DISABLED TRUE
)
endif()
+
add_command(set_tests_properties
- "${testname}"
+ "${guarded_testname}"
PROPERTIES
WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
SKIP_REGULAR_EXPRESSION "\\\\[ SKIPPED \\\\]"
${properties}
)
- list(APPEND tests_buffer "${testname}")
- list(LENGTH tests_buffer tests_buffer_length)
- if(${tests_buffer_length} GREATER "250")
- flush_tests_buffer()
+
+ # possibly unbalanced square brackets render lists invalid so skip such tests in _TEST_LIST
+ if(NOT "${testname}" MATCHES [=[(\[|\])]=])
+ # escape ;
+ string(REPLACE [[;]] [[\;]] testname "${testname}")
+ list(APPEND tests_buffer "${testname}")
+ list(LENGTH tests_buffer tests_buffer_length)
+ if(${tests_buffer_length} GREATER "250")
+ flush_tests_buffer()
+ endif()
endif()
endif()
endif()
@@ -173,7 +215,7 @@ function(gtest_discover_tests_impl)
# Create a list of all discovered tests, which users may use to e.g. set
# properties on the tests
flush_tests_buffer()
- add_command(set ${_TEST_LIST} ${tests})
+ add_command(set "" ${_TEST_LIST} ${tests})
# Write CTest script
flush_script()
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt
index acff3bc..9c0b775 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt
@@ -41,12 +41,28 @@ Test project .*
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"backslash\\"!1 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:param/special\.case/"\${var}"!1
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"\${var}"!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/'\['!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/'\['!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/"\]\]=\]"!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"\]\]=\]"!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/"__osbtext"!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"__osbtext"!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/"__csb___text"!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"__csb___text"!1 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:ns\.param/special\.case/"semicolon;"!1
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"semicolon;"!1 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:ns\.param/special\.case/"backslash\\"!1
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"backslash\\"!1 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:ns\.param/special\.case/"\${var}"!1
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"\${var}"!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/'\['!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/'\['!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/"\]\]=\]"!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"\]\]=\]"!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/"__osbtext"!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"__osbtext"!1 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/"__csb___text"!1
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"__csb___text"!1 \.+ +Passed +[0-9.]+ sec
100% tests passed, 0 tests failed out of [0-9]+
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt
index 703bae2..b0210c6 100644
--- a/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt
@@ -41,18 +41,34 @@ Test project .*
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"backslash\\"!2 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:param/special\.case/"\${var}"!2
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"\${var}"!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/'\['!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/'\['!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/"\]\]=\]"!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"\]\]=\]"!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/"__osbtext"!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"__osbtext"!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:param/special\.case/"__csb___text"!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:param/special\.case/"__csb___text"!2 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:ns\.param/special\.case/"semicolon;"!2
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"semicolon;"!2 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:ns\.param/special\.case/"backslash\\"!2
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"backslash\\"!2 \.+ +Passed +[0-9.]+ sec
*Start +[0-9]+: TEST:ns\.param/special\.case/"\${var}"!2
*[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"\${var}"!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/'\['!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/'\['!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/"\]\]=\]"!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"\]\]=\]"!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/"__osbtext"!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"__osbtext"!2 \.+ +Passed +[0-9.]+ sec
+ *Start +[0-9]+: TEST:ns\.param/special\.case/"__csb___text"!2
+ *[0-9]+/[0-9]+ +Test +#[0-9]+: TEST:ns\.param/special\.case/"__csb___text"!2 \.+ +Passed +[0-9.]+ sec
100% tests passed, 0 tests failed out of [0-9]+
Total Test time \(real\) = +[0-9.]+ sec
The following tests did not run:
-[ 0-9]+ - TEST:basic\.disabled_case!2 \(Disabled\)
-[ 0-9]+ - TEST:ns\.basic\.disabled_case!2 \(Disabled\)
-[ 0-9]+ - TEST:disabled\.case!2 \(Disabled\)
+[ 0-9]+- TEST:basic\.disabled_case!2 \(Disabled\)
+[ 0-9]+- TEST:ns\.basic\.disabled_case!2 \(Disabled\)
+[ 0-9]+- TEST:disabled\.case!2 \(Disabled\)
diff --git a/Tests/RunCMake/GoogleTest/fake_gtest.cpp b/Tests/RunCMake/GoogleTest/fake_gtest.cpp
index 36f1d3c..aa6468c 100644
--- a/Tests/RunCMake/GoogleTest/fake_gtest.cpp
+++ b/Tests/RunCMake/GoogleTest/fake_gtest.cpp
@@ -57,6 +57,10 @@ int main(int argc, char** argv)
std::cout << " case/0 # GetParam() = \"semicolon;\"" << std::endl;
std::cout << " case/1 # GetParam() = \"backslash\\\"" << std::endl;
std::cout << " case/2 # GetParam() = \"${var}\"" << std::endl;
+ std::cout << " case/3 # GetParam() = '['" << std::endl;
+ std::cout << " case/4 # GetParam() = \"]]=]\"" << std::endl;
+ std::cout << " case/5 # GetParam() = \"__osbtext\"" << std::endl;
+ std::cout << " case/6 # GetParam() = \"__csb___text\"" << std::endl;
}
}
return 0;