ListTest.cmake.in 7.3 KB

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