aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/test_ports/unit-test-cmake/test-macros.cmake
blob: af5fc7f0072b0f07370de9895ebfb41b18d11ae7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
include_guard(GLOBAL)

function(set_fatal_error err)
    set(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR "ON" CACHE BOOL "" FORCE)
    set(Z_VCPKG_UNIT_TEST_FATAL_ERROR "${err}" CACHE STRING "" FORCE)
endfunction()
function(unset_fatal_error)
    set(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR "OFF" CACHE BOOL "" FORCE)
endfunction()
function(set_has_error)
    set(Z_VCPKG_UNIT_TEST_HAS_ERROR ON CACHE BOOL "" FORCE)
endfunction()

macro(message level msg)
    if("${level}" STREQUAL "FATAL_ERROR")
        set_fatal_error("${msg}")
        return()
    else()
        _message("${level}" "${msg}") # note: this results in incorrect printing, but that's fine
        # message(STATUS "\${asdf}") will result in
        # message(STATUS "${asdf}"), since that's how macro arguments work.
    endif()
endmacro()

# Call this at the end of testing.
macro(unit_test_report_result)
    if(Z_VCPKG_UNIT_TEST_HAS_ERROR)
        _message(FATAL_ERROR "At least one test failed")
    endif()
endmacro()

set(Z_VCPKG_UNIT_TEST_HAS_ERROR OFF CACHE BOOL "" FORCE)
unset_fatal_error()

# Set <namespace>_MATCHED, preserve parent scope's CMAKE_MATCH_<...>
function(unit_test_match namespace value regex)
    if("${value}" MATCHES "${regex}")
        set("${namespace}_MATCHED" ON PARENT_SCOPE)
        if("${CMAKE_MATCH_COUNT}" EQUAL "0")
            return()
        endif()

        foreach(match RANGE 1 "${CMAKE_MATCH_COUNT}")
            set("${namespace}_CMAKE_MATCH_${match}" "${CMAKE_MATCH_${match}}" PARENT_SCOPE)
        endforeach()
    else()
        set("${namespace}_MATCHED" OFF PARENT_SCOPE)
    endif()
endfunction()

function(unit_test_check_variable_unset utcvu_test utcvu_variable)
    cmake_language(EVAL CODE "${utcvu_test}")
    if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
        unset_fatal_error()
        set_has_error()
        message(SEND_ERROR "${utcvu_test} had an unexpected FATAL_ERROR;
    expected: \"${utcvu_value}\"")
        message(SEND_ERROR "FATAL_ERROR: ${Z_VCPKG_UNIT_TEST_FATAL_ERROR}")
        return()
    endif()

    unit_test_match(utcvu "${utcvu_variable}" [[^(ENV|CACHE)\{(.*)\}$]])
    if(utcvu_MATCHED)
        message(STATUS "utcvu_variable: ${utcvu_CMAKE_MATCH_2}")
        if("${utcvu_CMAKE_MATCH_1}" STREQUAL "ENV")
            set(utcvu_actual_value "$ENV{${utcvu_CMAKE_MATCH_2}}")
        elseif("${utcvu_CMAKE_MATCH_1}" STREQUAL "CACHE")
            set(utcvu_actual_value "$CACHE{${utcvu_CMAKE_MATCH_2}}")
        else()
            _message(FATAL_ERROR "unexpected value for CMAKE_MATCH_1: ${utcvu_CMAKE_MATCH_1}")
        endif()
    else()
        set(utcvu_actual_value "${${utcvu_variable}}")
    endif()

    if(DEFINED "${utcvu_variable}")
        message(SEND_ERROR "${utcvu_test} set ${utcvu_variable};
    expected: \"${utcvu_variable}\" unset
    actual  : \"${utcvu_actual_value}\"")
        set_has_error()
        return()
    endif()
endfunction()

function(unit_test_check_variable_equal utcve_test utcve_variable utcve_value)
    cmake_language(EVAL CODE "${utcve_test}")
    if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
        unset_fatal_error()
        set_has_error()
        message(SEND_ERROR "${utcve_test} had an unexpected FATAL_ERROR;
    expected: \"${utcve_value}\"")
        message(SEND_ERROR "FATAL_ERROR: ${Z_VCPKG_UNIT_TEST_FATAL_ERROR}")
        return()
    endif()

    unit_test_match(utcve "${utcve_variable}" "^ENV\\{")
    if(NOT DEFINED "${utcve_variable}" AND NOT utcve_MATCHED)
        message(SEND_ERROR "${utcve_test} failed to set ${utcve_variable};
    expected: \"${utcve_value}\"")
        set_has_error()
        return()
    endif()

    unit_test_match(utcve "${utcve_variable}" [[^(ENV|CACHE)\{(.*)\}$]])
    if(utcve_MATCHED)
        if("${utcve_CMAKE_MATCH_1}" STREQUAL "ENV")
            set(utcve_actual_value "$ENV{${utcve_CMAKE_MATCH_2}}")
        elseif("${utcve_CMAKE_MATCH_1}" STREQUAL "CACHE")
            set(utcve_actual_value "$CACHE{${utcve_CMAKE_MATCH_2}}")
        else()
            _message(FATAL_ERROR "unexpected value for CMAKE_MATCH_1: ${utcve_CMAKE_MATCH_1}")
        endif()
    else()
        set(utcve_actual_value "${${utcve_variable}}")
    endif()

    if(NOT "${utcve_actual_value}" STREQUAL "${utcve_value}")
        message(SEND_ERROR "${utcve_test} resulted in the wrong value for ${utcve_variable};
    expected: \"${utcve_value}\"
    actual  : \"${utcve_actual_value}\"")
        set_has_error()
        return()
    endif()
endfunction()

function(unit_test_check_variable_not_equal utcve_test utcve_variable utcve_value)
    cmake_language(EVAL CODE "${utcve_test}")
    if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
        unset_fatal_error()
        set_has_error()
        message(SEND_ERROR "${utcve_test} had an unexpected FATAL_ERROR;
    expected: \"${utcve_value}\"")
        message(SEND_ERROR "FATAL_ERROR: ${Z_VCPKG_UNIT_TEST_FATAL_ERROR}")
        return()
    endif()

    unit_test_match(utcve "${utcve_variable}" [[^(ENV|CACHE)\{(.*)\}$]])
    if(utcve_MATCHED)
        if("${utcve_CMAKE_MATCH_1}" STREQUAL "ENV")
            set(utcve_actual_value "$ENV{${utcve_CMAKE_MATCH_2}}")
        elseif("${utcve_CMAKE_MATCH_1}" STREQUAL "CACHE")
            set(utcve_actual_value "$CACHE{${utcve_CMAKE_MATCH_2}}")
        else()
            _message(FATAL_ERROR "unexpected value for CMAKE_MATCH_1: ${utcve_CMAKE_MATCH_1}")
        endif()
    else()
        set(utcve_actual_value "${${utcve_variable}}")
    endif()

    if("${utcve_actual_value}" STREQUAL "${utcve_value}")
        message(SEND_ERROR "${utcve_test} failed to change ${utcve_variable};
    unchanged: \"${utcve_value}\"")
        set_has_error()
        return()
    endif()
endfunction()

function(unit_test_ensure_success utcve_test)
    cmake_language(EVAL CODE "${utcve_test}")
    if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
        set_has_error()
        message(SEND_ERROR "${utcve_test} was expected to be successful.")
    endif()
    unset_fatal_error()
endfunction()
function(unit_test_ensure_fatal_error utcve_test)
    cmake_language(EVAL CODE "${utcve_test}")
    if(NOT Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR)
        set_has_error()
        message(SEND_ERROR "${utcve_test} was expected to be a FATAL_ERROR.")
    endif()
    unset_fatal_error()
endfunction()