summaryrefslogtreecommitdiffstats
path: root/tests/auto/cmake/test_config_expressions/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/cmake/test_config_expressions/CMakeLists.txt')
-rw-r--r--tests/auto/cmake/test_config_expressions/CMakeLists.txt134
1 files changed, 134 insertions, 0 deletions
diff --git a/tests/auto/cmake/test_config_expressions/CMakeLists.txt b/tests/auto/cmake/test_config_expressions/CMakeLists.txt
new file mode 100644
index 0000000000..e3863b738a
--- /dev/null
+++ b/tests/auto/cmake/test_config_expressions/CMakeLists.txt
@@ -0,0 +1,134 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+
+project(test_config_expressions)
+
+find_package(Qt6 REQUIRED)
+include(QtFeature)
+
+function(assert expected_value)
+ set(expression ${ARGN})
+ qt_evaluate_config_expression(result ${expression})
+ if(NOT "${result}" STREQUAL "${expected_value}")
+ message(FATAL_ERROR
+ "Unexpected value '${result}' when evaluating expression '${expression}'.")
+ endif()
+endfunction()
+
+function(assert_T)
+ assert(ON ${ARGN})
+endfunction()
+
+function(assert_F)
+ assert(OFF ${ARGN})
+endfunction()
+
+function(expect_failure expected_value)
+ set(expression ${ARGN})
+ qt_evaluate_config_expression(result ${expression})
+ if("${result}" STREQUAL "${expected_value}")
+ message(FATAL_ERROR
+ "Expression '${expression}' unexpectedly evaluated to the correct value '${result}'.")
+ endif()
+endfunction()
+
+function(expect_failure_T)
+ expect_failure(ON ${ARGN})
+endfunction()
+
+function(expect_failure_F)
+ expect_failure(OFF ${ARGN})
+endfunction()
+
+assert_T(ON)
+assert_T(TRUE)
+assert_F(OFF)
+assert_F(FALSE)
+
+assert_T(NOT FALSE)
+assert_F(NOT TRUE)
+
+assert_T(TRUE OR TRUE)
+assert_T(TRUE OR FALSE)
+assert_T(FALSE OR TRUE)
+assert_F(FALSE OR FALSE)
+
+assert_T(TRUE AND TRUE)
+assert_F(TRUE AND FALSE)
+assert_F(FALSE AND TRUE)
+assert_F(FALSE AND FALSE)
+
+# string comparison
+set(str1 "foo")
+set(str2 "bar")
+assert_T(str1 STREQUAL "foo")
+assert_T(str1 STREQUAL 'foo')
+expect_failure_T(str1 STREQUAL str1) # variable on rhs not supported
+expect_failure_T("foo" STREQUAL "foo") # literal on lhs not supported
+expect_failure_T('foo' STREQUAL 'foo') # literal on lhs not supported
+
+# comparison with empty string
+set(empty_string "")
+assert_T(empty_string STREQUAL '')
+assert_F(empty_string STREQUAL "x")
+
+# string matching
+set(processor ppc64)
+assert_T(${processor} MATCHES "(ppc|ppc64)$")
+assert_F(${processor} MATCHES "i[3-6]86$")
+
+# logical operators and parentheses
+set(A TRUE)
+set(B FALSE)
+set(C TRUE)
+assert_F(B OR B)
+assert_F(A AND B)
+assert_T(A AND (B OR C))
+assert_T((A AND B) OR C)
+assert_T((A AND B) OR (NOT B AND C))
+assert_F(NOT (B OR C))
+assert_T(NOT (A AND B))
+assert_F(NOT (B OR C))
+
+# target check
+set(lib1_cpp "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp")
+file(WRITE "${lib1_cpp}" "int foo() { return 42; }")
+add_library(lib1 STATIC EXCLUDE_FROM_ALL "${lib1_cpp}")
+assert_T(TARGET lib1)
+assert_F(TARGET does_not_exist)
+
+# IN_LIST
+set(primary_colors red yellow blue)
+assert_T(yellow IN_LIST primary_colors)
+assert_F(mauve IN_LIST primary_colors)
+
+# more complex string check from a real world feature
+set(INPUT_xcb "")
+set(INPUT_xkbcommon no)
+assert_F(NOT INPUT_xcb STREQUAL '' AND ( NOT INPUT_xcb STREQUAL 'no' )
+ AND INPUT_xkbcommon STREQUAL 'no')
+set(INPUT_xcb no)
+set(INPUT_xkbcommon no)
+assert_F(NOT INPUT_xcb STREQUAL '' AND ( NOT INPUT_xcb STREQUAL 'no' )
+ AND INPUT_xkbcommon STREQUAL 'no')
+set(INPUT_xcb yes)
+set(INPUT_xkbcommon no)
+assert_T(NOT INPUT_xcb STREQUAL '' AND ( NOT INPUT_xcb STREQUAL 'no' )
+ AND INPUT_xkbcommon STREQUAL 'no')
+set(INPUT_xcb no)
+set(INPUT_xkbcommon yes)
+assert_F(NOT INPUT_xcb STREQUAL '' AND ( NOT INPUT_xcb STREQUAL 'no' )
+ AND INPUT_xkbcommon STREQUAL 'no')
+
+set(FEATURE_shared ON)
+set(FEATURE_debug ON)
+set(FEATURE_debug_and_release OFF)
+set(FEATURE_force_debug_info OFF)
+set(TEST_separate_debug_info ON)
+assert_T(
+ ( FEATURE_shared )
+ AND ( FEATURE_debug OR FEATURE_debug_and_release OR FEATURE_force_debug_info )
+ AND ( MSVC OR APPLE OR TEST_separate_debug_info )
+)