77c34a9c4455698e32228bb48db70fff4af58727
[platform/upstream/cmake.git] / Tests / CMakeTests / ListTest.cmake.in
1 include("@CMAKE_CURRENT_SOURCE_DIR@/CheckCMakeTest.cmake")
2
3 include("@CMAKE_CURRENT_SOURCE_DIR@/../RegexEscapeString.cmake")
4 REGEX_ESCAPE_STRING(CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@")
5
6 macro(TEST command expected)
7   if("x${result}" STREQUAL "x${expected}")
8     #message("TEST \"${command}\" success: \"${result}\" expected: \"${expected}\"")
9   else()
10     message(SEND_ERROR "${CMAKE_CURRENT_LIST_LINE}: TEST \"${command}\" failed: \"${result}\" expected: \"${expected}\"")
11   endif()
12 endmacro()
13
14 set(mylist andy bill ken brad)
15
16 list(LENGTH mylist result)
17 TEST("LENGTH mylist result" "4")
18 list(LENGTH "mylist" result)
19 TEST("LENGTH \"mylist\" result" "4")
20
21 list(LENGTH "nonexiting_list1" result)
22 TEST("LENGTH \"nonexiting_list1\" result" "0")
23
24 list(GET mylist 3 2 1 0 result)
25 TEST("GET mylist 3 2 1 0 result" "brad;ken;bill;andy")
26
27 list(GET mylist 0 item0)
28 list(GET mylist 1 item1)
29 list(GET mylist 2 item2)
30 list(GET mylist 3 item3)
31 set(result "${item3}" "${item0}" "${item1}" "${item2}")
32 TEST("GET individual 3 2 1 0 result" "brad;andy;bill;ken")
33
34 list(GET mylist -1 -2 -3 -4 result)
35 TEST("GET mylist -1 -2 -3 -4 result" "brad;ken;bill;andy")
36
37 list(GET mylist -1 2 -3 0 result)
38 TEST("GET mylist -1 2 -3 0 ${result}" "brad;ken;bill;andy")
39
40 list(GET "nonexiting_list2" 1 result)
41 TEST("GET \"nonexiting_list2\" 1 result" "NOTFOUND")
42
43 set(result andy)
44 list(APPEND result brad)
45 TEST("APPEND result brad" "andy;brad")
46
47 list(APPEND "nonexiting_list3" brad)
48 set(result "${nonexiting_list3}")
49 TEST("APPEND \"nonexiting_list3\" brad" "brad")
50
51 list(INSERT "nonexiting_list4" 0 andy bill brad ken)
52 set(result "${nonexiting_list4}")
53 TEST("APPEND \"nonexiting_list4\" andy bill brad ken" "andy;bill;brad;ken")
54
55 set(result andy brad)
56 list(INSERT result -1 bill ken)
57 TEST("INSERT result -1 bill ken" "andy;bill;ken;brad")
58
59 set(result andy bill brad ken bob)
60 list(REMOVE_ITEM result bob)
61 TEST("REMOVE_ITEM result bob" "andy;bill;brad;ken")
62
63 set(result andy bill bob brad ken peter)
64 list(REMOVE_ITEM result peter bob)
65 TEST("REMOVE_ITEM result peter bob" "andy;bill;brad;ken")
66
67 set(result bob andy bill bob brad ken bob)
68 list(REMOVE_ITEM result bob)
69 TEST("REMOVE_ITEM result bob" "andy;bill;brad;ken")
70
71 set(result andy bill bob brad ken peter)
72 list(REMOVE_AT result 2 -1)
73 TEST("REMOVE_AT result 2 -1" "andy;bill;brad;ken")
74
75 # ken is at index 2, nobody is not in the list so -1 should be returned
76 set(mylist andy bill ken brad)
77 list(FIND mylist ken result)
78 TEST("FIND mylist ken result" "2")
79
80 list(FIND mylist nobody result)
81 TEST("FIND mylist nobody result" "-1")
82
83 set(result ken bill andy brad)
84 list(SORT result)
85 TEST("SORT result" "andy;bill;brad;ken")
86
87 set(result andy bill brad ken)
88 list(REVERSE result)
89 TEST("REVERSE result" "ken;brad;bill;andy")
90
91 set(result bill andy bill brad ken ken ken)
92 list(REMOVE_DUPLICATES result)
93 TEST("REMOVE_DUPLICATES result" "bill;andy;brad;ken")
94
95 # these commands should just do nothing if the list is already empty
96 set(result "")
97 list(REMOVE_DUPLICATES result)
98 TEST("REMOVE_DUPLICATES empty result" "")
99
100 list(REVERSE result)
101 TEST("REVERSE empty result" "")
102
103 list(SORT result)
104 TEST("SORT empty result" "")
105
106 set(No-Arguments-RESULT 1)
107 set(No-Arguments-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-No-Arguments.cmake:1 \\(list\\):.*list must be called with at least two arguments.*")
108
109 # these trigger top-level condition
110 foreach(cmd IN ITEMS Append Find Get Insert Length Reverse Remove_At Remove_Duplicates Remove_Item Sort)
111   set(${cmd}-No-Arguments-RESULT 1)
112   set(${cmd}-No-Arguments-STDERR ".*CMake Error at List-${cmd}-No-Arguments.cmake:1 \\(list\\):.*list must be called with at least two arguments.*")
113   string(TOUPPER ${cmd} cmd_upper)
114   set(_test_file_name "${CMAKE_CURRENT_BINARY_DIR}/List-${cmd}-No-Arguments.cmake")
115   file(WRITE "${_test_file_name}" "list(${cmd_upper})\n")
116   check_cmake_test_single(List "${cmd}-No-Arguments" "${_test_file_name}")
117 endforeach()
118
119 set(Get-List-Only-STDERR "at least three")
120 set(Find-List-Only-STDERR "three")
121 set(Insert-List-Only-STDERR "at least three")
122 set(Length-List-Only-STDERR "two")
123 set(Remove_At-List-Only-STDERR "at least two")
124 set(Remove_Item-List-Only-STDERR "two or more")
125
126 foreach(cmd IN ITEMS Find Get Insert Length Remove_At Remove_Item)
127   string(TOUPPER ${cmd} cmd_upper)
128   set(${cmd}-List-Only-RESULT 1)
129   set(${cmd}-List-Only-STDERR ".*CMake Error at List-${cmd}-List-Only.cmake:1 \\(list\\):.*list sub-command ${cmd_upper} requires ${${cmd}-List-Only-STDERR} arguments.*")
130   set(_test_file_name "${CMAKE_CURRENT_BINARY_DIR}/List-${cmd}-List-Only.cmake")
131   file(WRITE "${_test_file_name}" "list(${cmd_upper} mylist)\n")
132   check_cmake_test_single(List "${cmd}-List-Only" "${_test_file_name}")
133 endforeach()
134
135 set(Length-Too-Many-Arguments-RESULT 1)
136 set(Length-Too-Many-Arguments-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-Length-Too-Many-Arguments.cmake:1 \\(list\\):.*list sub-command LENGTH requires two arguments.*")
137
138 set(Reverse-Too-Many-Arguments-RESULT 1)
139 set(Reverse-Too-Many-Arguments-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-Reverse-Too-Many-Arguments.cmake:1 \\(list\\):.*list sub-command REVERSE only takes one argument.*")
140
141 set(Remove_Duplicates-Too-Many-Arguments-RESULT 1)
142 set(Remove_Duplicates-Too-Many-Arguments-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-Remove_Duplicates-Too-Many-Arguments.cmake:1 \\(list\\):.*list sub-command REMOVE_DUPLICATES only takes one argument.*")
143
144 set(Sort-Too-Many-Arguments-RESULT 1)
145 set(Sort-Too-Many-Arguments-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-Sort-Too-Many-Arguments.cmake:1 \\(list\\):.*list sub-command SORT only takes one argument.*")
146
147 set(Invalid-Subcommand-RESULT 1)
148 set(Invalid-Subcommand-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-Invalid-Subcommand.cmake:1 \\(list\\):.*list does not recognize sub-command NO_SUCH_SUBCOMMAND.*")
149
150 foreach(cmd Get Insert Remove_At)
151   set(${cmd}-Invalid-Index-RESULT 1)
152   set(${cmd}-Invalid-Index-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-${cmd}-Invalid-Index.cmake:2 \\(list\\):.*list index: 3 out of range \\(-3, 2\\).*")
153 endforeach()
154
155 foreach(cmd Remove_Item Reverse Remove_Duplicates Sort Remove_At)
156   string(TOUPPER ${cmd} Cmd)
157   set(${cmd}-Nonexistent-List-RESULT 1)
158   set(${cmd}-Nonexistent-List-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-${cmd}-Nonexistent-List.cmake:2 \\(list\\):.*sub-command ${Cmd} requires list to be present.*")
159 endforeach()
160
161 set(Get-CMP0007-Warn-RESULT 0)
162 set(Get-CMP0007-Warn-STDERR ".*CMake Warning \\(dev\\) at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?List-Get-CMP0007-Warn.cmake:3 \\(list\\):.*Policy CMP0007 is not set:.*")
163
164 check_cmake_test(List
165   No-Arguments
166   Length-Too-Many-Arguments
167   Reverse-Too-Many-Arguments
168   Remove_Duplicates-Too-Many-Arguments
169   Sort-Too-Many-Arguments
170   Invalid-Subcommand
171   Get-Invalid-Index
172   Insert-Invalid-Index
173   Remove_Item-Nonexistent-List
174   Reverse-Nonexistent-List
175   Remove_Duplicates-Nonexistent-List
176   Sort-Nonexistent-List
177   Remove_At-Nonexistent-List
178   Remove_At-Invalid-Index
179   Get-CMP0007-Warn
180 )
181
182 set(thelist "" NEW OLD)
183
184 foreach (_pol ${thelist})
185     cmake_policy(SET CMP0007 ${_pol})
186     list(GET thelist 1 thevalue)
187     if (NOT thevalue STREQUAL _pol)
188         message(SEND_ERROR "returned element '${thevalue}', but expected '${_pol}'")
189     endif()
190 endforeach (_pol)