From 064c415d275433c332b7a38eb99df5d46aaa9f9e Mon Sep 17 00:00:00 2001
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Fri, 24 Oct 2014 10:47:36 -0400
Subject: test: add test for PARENT_SCOPE behavior

Test code courtesy of Alex Merry <alex.merry@kde.org>.
---
 Tests/RunCMake/set/ParentPulling-stderr.txt |  3 +++
 Tests/RunCMake/set/ParentPulling.cmake      | 13 +++++++++++++
 Tests/RunCMake/set/RunCMakeTest.cmake       |  1 +
 3 files changed, 17 insertions(+)
 create mode 100644 Tests/RunCMake/set/ParentPulling-stderr.txt
 create mode 100644 Tests/RunCMake/set/ParentPulling.cmake

diff --git a/Tests/RunCMake/set/ParentPulling-stderr.txt b/Tests/RunCMake/set/ParentPulling-stderr.txt
new file mode 100644
index 0000000..768549b
--- /dev/null
+++ b/Tests/RunCMake/set/ParentPulling-stderr.txt
@@ -0,0 +1,3 @@
+^before PARENT_SCOPE blah=value2
+after PARENT_SCOPE blah=value2
+in parent scope, blah=value2$
diff --git a/Tests/RunCMake/set/ParentPulling.cmake b/Tests/RunCMake/set/ParentPulling.cmake
new file mode 100644
index 0000000..2614533
--- /dev/null
+++ b/Tests/RunCMake/set/ParentPulling.cmake
@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.0)
+project(Minimal NONE)
+
+function(test_set)
+    set(blah "value2")
+    message("before PARENT_SCOPE blah=${blah}")
+    set(blah ${blah} PARENT_SCOPE)
+    message("after PARENT_SCOPE blah=${blah}")
+endfunction()
+
+set(blah value1)
+test_set()
+message("in parent scope, blah=${blah}")
diff --git a/Tests/RunCMake/set/RunCMakeTest.cmake b/Tests/RunCMake/set/RunCMakeTest.cmake
index 5d036e3..9caf53b 100644
--- a/Tests/RunCMake/set/RunCMakeTest.cmake
+++ b/Tests/RunCMake/set/RunCMakeTest.cmake
@@ -1,3 +1,4 @@
 include(RunCMake)
 
 run_cmake(PARENT_SCOPE)
+run_cmake(ParentPulling)
-- 
cgit v0.12


From e0c0b1ace50f77f2a76dcc7020e3a4251bc6bf96 Mon Sep 17 00:00:00 2001
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Fri, 24 Oct 2014 12:37:29 -0400
Subject: test: add a test for PARENT_SCOPE with multiple scopes

See the comment in the test for what is being tested here.
---
 .../RunCMake/set/ParentPullingRecursive-stderr.txt | 144 +++++++++++++++++++++
 Tests/RunCMake/set/ParentPullingRecursive.cmake    | 104 +++++++++++++++
 Tests/RunCMake/set/RunCMakeTest.cmake              |   1 +
 3 files changed, 249 insertions(+)
 create mode 100644 Tests/RunCMake/set/ParentPullingRecursive-stderr.txt
 create mode 100644 Tests/RunCMake/set/ParentPullingRecursive.cmake

diff --git a/Tests/RunCMake/set/ParentPullingRecursive-stderr.txt b/Tests/RunCMake/set/ParentPullingRecursive-stderr.txt
new file mode 100644
index 0000000..f3260ae
--- /dev/null
+++ b/Tests/RunCMake/set/ParentPullingRecursive-stderr.txt
@@ -0,0 +1,144 @@
+----------
+variable values at top before calls:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->top<--
+top_explicit_inner_unset: <undefined>
+top_explicit_inner_tounset: -->top<--
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: <undefined>
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: <undefined>
+outer_explicit_inner_unset: <undefined>
+outer_explicit_inner_tounset: <undefined>
+----------
+----------
+variable values at outer start:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->top<--
+top_explicit_inner_unset: <undefined>
+top_explicit_inner_tounset: -->top<--
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: <undefined>
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: <undefined>
+outer_explicit_inner_unset: <undefined>
+outer_explicit_inner_tounset: <undefined>
+----------
+----------
+variable values at outer before inner:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->top<--
+top_explicit_inner_unset: <undefined>
+top_explicit_inner_tounset: -->top<--
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: -->outer<--
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: -->outer<--
+outer_explicit_inner_unset: <undefined>
+outer_explicit_inner_tounset: -->outer<--
+----------
+----------
+variable values at inner start:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->top<--
+top_explicit_inner_unset: <undefined>
+top_explicit_inner_tounset: -->top<--
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: -->outer<--
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: -->outer<--
+outer_explicit_inner_unset: <undefined>
+outer_explicit_inner_tounset: -->outer<--
+----------
+----------
+variable values at inner end:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->top<--
+top_explicit_inner_unset: <undefined>
+top_explicit_inner_tounset: -->top<--
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: -->outer<--
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: -->outer<--
+outer_explicit_inner_unset: <undefined>
+outer_explicit_inner_tounset: -->outer<--
+----------
+----------
+variable values at outer after inner:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->inner<--
+top_explicit_inner_unset: -->inner<--
+top_explicit_inner_tounset: <undefined>
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: -->outer<--
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: -->inner<--
+outer_explicit_inner_unset: -->inner<--
+outer_explicit_inner_tounset: <undefined>
+----------
+----------
+variable values at outer end:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->inner<--
+top_explicit_inner_unset: -->inner<--
+top_explicit_inner_tounset: <undefined>
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_set: -->top<--
+top_explicit_outer_unset: <undefined>
+top_explicit_outer_tounset: -->top<--
+outer_implicit_inner_set: -->outer<--
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: -->inner<--
+outer_explicit_inner_unset: -->inner<--
+outer_explicit_inner_tounset: <undefined>
+----------
+----------
+variable values at top after calls:
+top_implicit_inner_set: -->top<--
+top_implicit_inner_unset: <undefined>
+top_explicit_inner_set: -->outer<--
+top_explicit_inner_unset: -->outer<--
+top_explicit_inner_tounset: <undefined>
+top_implicit_outer_set: -->top<--
+top_explicit_outer_unset: -->outer<--
+top_explicit_outer_set: -->outer<--
+top_explicit_outer_unset: -->outer<--
+top_explicit_outer_tounset: <undefined>
+outer_implicit_inner_set: <undefined>
+outer_implicit_inner_unset: <undefined>
+outer_explicit_inner_set: <undefined>
+outer_explicit_inner_unset: <undefined>
+outer_explicit_inner_tounset: <undefined>
+----------
diff --git a/Tests/RunCMake/set/ParentPullingRecursive.cmake b/Tests/RunCMake/set/ParentPullingRecursive.cmake
new file mode 100644
index 0000000..a3e29f5
--- /dev/null
+++ b/Tests/RunCMake/set/ParentPullingRecursive.cmake
@@ -0,0 +1,104 @@
+cmake_minimum_required(VERSION 3.0)
+project(Minimal NONE)
+
+function(report where)
+    message("----------")
+    message("variable values at ${where}:")
+    foreach(var IN ITEMS
+            top_implicit_inner_set top_implicit_inner_unset
+            top_explicit_inner_set top_explicit_inner_unset top_explicit_inner_tounset
+            top_implicit_outer_set top_explicit_outer_unset
+            top_explicit_outer_set top_explicit_outer_unset top_explicit_outer_tounset
+
+            outer_implicit_inner_set outer_implicit_inner_unset
+            outer_explicit_inner_set outer_explicit_inner_unset outer_explicit_inner_tounset)
+        if(DEFINED ${var})
+            message("${var}: -->${${var}}<--")
+        else()
+            message("${var}: <undefined>")
+        endif()
+    endforeach()
+    message("----------")
+endfunction()
+
+macro(set_values upscope downscope value)
+    # Pull the value in implicitly.
+    set(dummy ${${upscope}_implicit_${downscope}_set})
+    set(dummy ${${upscope}_implicit_${downscope}_unset})
+    # Pull it down explicitly.
+    set(${upscope}_explicit_${downscope}_set "${value}" PARENT_SCOPE)
+    set(${upscope}_explicit_${downscope}_unset "${value}" PARENT_SCOPE)
+    set(${upscope}_explicit_${downscope}_tounset PARENT_SCOPE)
+endmacro()
+
+function(inner)
+    report("inner start")
+
+    set_values(top inner inner)
+    set_values(outer inner inner)
+
+    report("inner end")
+endfunction()
+
+function(outer)
+    report("outer start")
+
+    set_values(top outer outer)
+
+    # Set values for inner to manipulate.
+    set(outer_implicit_inner_set outer)
+    set(outer_implicit_inner_unset)
+    set(outer_explicit_inner_set outer)
+    set(outer_explicit_inner_unset)
+    set(outer_explicit_inner_tounset outer)
+
+    report("outer before inner")
+
+    inner()
+
+    report("outer after inner")
+
+    # Do what inner does so that we can test the values that inner should have
+    # pulled through to here.
+    set_values(top inner outer)
+
+    report("outer end")
+endfunction()
+
+# variable name is:
+#
+#    <upscope>_<pulltype>_<downscope>_<settype>
+#
+# where the value is the name of the scope it was set in. The scopes available
+# are "top", "outer", and "inner". The pull type may either be "implicit" or
+# "explicit" based on whether the pull is due to a variable dereference or a
+# PARENT_SCOPE setting. The settype is "set" where both scopes set a value,
+# "unset" where upscope unsets it and downscope sets it, and "tounset" where
+# upscope sets it and downscope unsets it.
+#
+# We test the following combinations:
+#
+#   - outer overriding top's values;
+#   - inner overriding top's values;
+#   - inner overriding outer's values; and
+#   - outer overriding inner's values in top after inner has run.
+
+# Set values for inner to manipulate.
+set(top_implicit_inner_set top)
+set(top_implicit_inner_unset)
+set(top_explicit_inner_set top)
+set(top_explicit_inner_unset)
+set(top_explicit_inner_tounset top)
+
+# Set values for outer to manipulate.
+set(top_implicit_outer_set top)
+set(top_implicit_outer_unset)
+set(top_explicit_outer_set top)
+set(top_explicit_outer_unset)
+set(top_explicit_outer_tounset top)
+
+report("top before calls")
+
+outer()
+
+report("top after calls")
diff --git a/Tests/RunCMake/set/RunCMakeTest.cmake b/Tests/RunCMake/set/RunCMakeTest.cmake
index 9caf53b..0b96b28 100644
--- a/Tests/RunCMake/set/RunCMakeTest.cmake
+++ b/Tests/RunCMake/set/RunCMakeTest.cmake
@@ -2,3 +2,4 @@ include(RunCMake)
 
 run_cmake(PARENT_SCOPE)
 run_cmake(ParentPulling)
+run_cmake(ParentPullingRecursive)
-- 
cgit v0.12