# Prepare variable definitions.
set(VAR_UNDEFINED)
set(VAR_PATH /some/path/to/a/file.txt)
set(FALSE_NAMES OFF NO FALSE N FOO-NOTFOUND IGNORE Off No False Ignore off n no false ignore)
set(TRUE_NAMES ON YES TRUE Y On Yes True on yes true y)
foreach(_arg "" 0 1 2 ${TRUE_NAMES} ${FALSE_NAMES})
  set(VAR_${_arg} "${_arg}")
endforeach()

include("@CMAKE_CURRENT_SOURCE_DIR@/../RegexEscapeString.cmake")
REGEX_ESCAPE_STRING(CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@")

macro(test_vars _old)
  # Variables set to false or not set.
  foreach(_var "" 0 ${FALSE_NAMES} UNDEFINED)
    if(VAR_${_var})
      message(FATAL_ERROR "${_old}if(VAR_${_var}) is true!")
    else()
      message(STATUS "${_old}if(VAR_${_var}) is false")
    endif()

    if(NOT VAR_${_var})
      message(STATUS "${_old}if(NOT VAR_${_var}) is true")
    else()
      message(FATAL_ERROR "${_old}if(NOT VAR_${_var}) is false!")
    endif()
  endforeach()

  # Variables set to true.
  foreach(_var 1 2 ${TRUE_NAMES} PATH)
    if(VAR_${_var})
      message(STATUS "${_old}if(VAR_${_var}) is true")
    else()
      message(FATAL_ERROR "${_old}if(VAR_${_var}) is false!")
    endif()

    if(NOT VAR_${_var})
      message(FATAL_ERROR "${_old}if(NOT VAR_${_var}) is true!")
    else()
      message(STATUS "${_old}if(NOT VAR_${_var}) is false")
    endif()
  endforeach()
endmacro()

#-----------------------------------------------------------------------------
# Test the OLD behavior of CMP0012.
cmake_policy(SET CMP0012 OLD)

# False constants not recognized (still false).
foreach(_false "" ${FALSE_NAMES})
  if("${_false}")
    message(FATAL_ERROR "OLD if(${_false}) is true!")
  else()
    message(STATUS "OLD if(${_false}) is false")
  endif()

  if(NOT "${_false}")
    message(STATUS "OLD if(NOT ${_false}) is true")
  else()
    message(FATAL_ERROR "OLD if(NOT ${_false}) is false!")
  endif()
endforeach()

# True constants not recognized.
foreach(_false ${TRUE_NAMES})
  if(${_false})
    message(FATAL_ERROR "OLD if(${_false}) is true!")
  else()
    message(STATUS "OLD if(${_false}) is false")
  endif()

  if(NOT ${_false})
    message(STATUS "OLD if(NOT ${_false}) is true")
  else()
    message(FATAL_ERROR "OLD if(NOT ${_false}) is false!")
  endif()
endforeach()

# Numbers not recognized properly.
foreach(_num 2 -2 2.0 -2.0 2x -2x)
  if(${_num})
    message(FATAL_ERROR "OLD if(${_num}) is true!")
  else()
    message(STATUS "OLD if(${_num}) is false")
  endif()

  if(NOT ${_num})
    message(FATAL_ERROR "OLD if(NOT ${_num}) is true!")
  else()
    message(STATUS "OLD if(NOT ${_num}) is false")
  endif()
endforeach()

test_vars("OLD ")

#-----------------------------------------------------------------------------

# Test the NEW behavior of CMP0012.
cmake_policy(SET CMP0012 NEW)

# Test false constants.
foreach(_false "" 0 ${FALSE_NAMES})
  if("${_false}")
    message(FATAL_ERROR "if(${_false}) is true!")
  else()
    message(STATUS "if(${_false}) is false")
  endif()

  if(NOT "${_false}")
    message(STATUS "if(NOT ${_false}) is true")
  else()
    message(FATAL_ERROR "if(NOT ${_false}) is false!")
  endif()
endforeach()

# Test true constants.
foreach(_true 1 ${TRUE_NAMES})
  if(${_true})
    message(STATUS "if(${_true}) is true")
  else()
    message(FATAL_ERROR "if(${_true}) is false!")
  endif()

  if(NOT ${_true})
    message(FATAL_ERROR "if(NOT ${_true}) is true!")
  else()
    message(STATUS "if(NOT ${_true}) is false")
  endif()
endforeach()

# Numbers recognized properly.
foreach(_num 2 -2 2.0 -2.0)
  if(${_num})
    message(STATUS "if(${_num}) is true")
  else()
    message(FATAL_ERROR "if(${_num}) is false!")
  endif()

  if(NOT ${_num})
    message(FATAL_ERROR "if(NOT ${_num}) is true!")
  else()
    message(STATUS "if(NOT ${_num}) is false")
  endif()
endforeach()

# Bad numbers not recognized.
foreach(_bad 2x -2x)
  if(${_bad})
    message(FATAL_ERROR "if(${_bad}) is true!")
  else()
    message(STATUS "if(${_bad}) is false")
  endif()

  if(NOT ${_bad})
    message(STATUS "if(NOT ${_bad}) is true")
  else()
    message(FATAL_ERROR "if(NOT ${_bad}) is false!")
  endif()
endforeach()

test_vars("")

set(Invalid-Argument-RESULT 1)
set(Invalid-Argument-STDERR ".*CMake Error at (${CTEST_ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/)?If-Invalid-Argument.cmake:1 \\(if\\):.*Unknown arguments specified.*")

include("@CMAKE_CURRENT_SOURCE_DIR@/CheckCMakeTest.cmake")
check_cmake_test(If
  Invalid-Argument
)
