function(ASSERT_EQUAL)
  if(NOT ARGC EQUAL 2)
    message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
  endif()

  if(NOT "${ARGV0}" STREQUAL "${ARGV1}")
    message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
  else()
    message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
  endif()
endfunction()

function(ASSERT_NOT_EQUAL)
  if(NOT ARGC EQUAL 2)
    message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
  endif()

  if("${ARGV0}" STREQUAL "${ARGV1}")
    message(FATAL_ERROR "assertion failed: '${ARGV0}' == '${ARGV1}'")
  else()
    message(STATUS "test passed: '${ARGV0}' != '${ARGV1}'")
  endif()
endfunction()

function(ASSERT_EMPTY)
  if(NOT ARGC EQUAL 0)
    message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
  endif()
endfunction()

function(ASSERT_DEFINED KEY)
  if(DEFINED ${KEY})
    message(STATUS "test passed: '${KEY}' is defined")
  else()
    message(FATAL_ERROR "assertion failed: '${KEY}' is not defined")
  endif()
endfunction()

function(ASSERT_NOT_DEFINED KEY)
  if(DEFINED ${KEY})
    message(FATAL_ERROR "assertion failed: '${KEY}' is defined (${${KEY}})")
  else()
    message(STATUS "test passed: '${KEY}' is not defined")
  endif()
endfunction()

function(ASSERT_TRUTHY KEY)
  if(${${KEY}})
    message(STATUS "test passed: '${KEY}' is set truthy")
  else()
    message(FATAL_ERROR "assertion failed: value of '${KEY}' is not truthy (${${KEY}})")
  endif()
endfunction()

function(ASSERT_FALSY KEY)
  if(${${KEY}})
    message(FATAL_ERROR "assertion failed: value of '${KEY}' is not falsy (${${KEY}})")
  else()
    message(STATUS "test passed: '${KEY}' is set falsy")
  endif()
endfunction()

function(ASSERTION_FAILED)
  message(FATAL_ERROR "assertion failed: ${ARGN}")
endfunction()

function(ASSERT_EXISTS file)
  if(EXISTS ${file})
    message(STATUS "test passed: '${file}' exists")
  else()
    message(FATAL_ERROR "assertion failed: file ${file} does not exist")
  endif()
endfunction()

function(ASSERT_NOT_EXISTS file)
  if(NOT EXISTS ${file})
    message(STATUS "test passed: '${file}' does not exist")
  else()
    message(FATAL_ERROR "assertion failed: file ${file} exists")
  endif()
endfunction()

function(ASSERT_CONTENTS_EQUAL file content)
  if(EXISTS ${file})
    file(READ ${file} file_content)
    if(content STREQUAL file_content)
      message(STATUS "test passed: '${file}' exists and contains '${content}'")
    else()
      message(FATAL_ERROR "assertion failed: file '${file}' does not contain expected content.")
    endif()
  else()
    message(FATAL_ERROR "assertion failed: file '${file} does not exist")
  endif()
endfunction()
