include(RunCMake)

cmake_policy(SET CMP0140 NEW)

# Arguments after the first are the files to validate against the schema
function(validate_fileapi_schema schema)
  if(NOT ARGN)
    # No files to validate against the schema
    return()
  endif()
  list(JOIN ARGN "\n" file_list)
  set(file_list_file ${RunCMake_TEST_BINARY_DIR}/check_file_list.txt)
  file(WRITE "${file_list_file}" "${file_list}")
  execute_process(
    COMMAND ${Python_EXECUTABLE}
      "${RunCMake_SOURCE_DIR}/fileapi_validate_schema.py"
        "${file_list_file}"
        "${schema}"
    RESULT_VARIABLE result
    OUTPUT_VARIABLE output
    ERROR_VARIABLE output
  )
  if(NOT result STREQUAL 0)
    string(REPLACE "\n" "\n  " output "${output}")
    string(APPEND RunCMake_TEST_FAILED
      "Failed to validate files against JSON schema: ${schema}\nOutput:\n${output}\n")
  endif()
  return(PROPAGATE RunCMake_TEST_FAILED)
endfunction()

# Function called in *-check.cmake scripts to check api files.
function(check_api expect)
  file(GLOB_RECURSE actual
    LIST_DIRECTORIES TRUE
    RELATIVE ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1
    ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/*
    )
  if(NOT "${actual}" MATCHES "${expect}")
    set(RunCMake_TEST_FAILED "API files:
  ${actual}
do not match what we expected:
  ${expect}
in directory:
  ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1")
  endif()
  if(NOT RunCMake_TEST_FAILED AND Python_EXECUTABLE AND CMake_TEST_JSON_SCHEMA)
    cmake_path(SET schema_dir NORMALIZE ${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api)
    set(prefix ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1)
    set(replies ${actual})
    list(FILTER replies INCLUDE REGEX "^reply/")
    set(schema_types
      index   # Special case, error replies also use this schema
      codemodel
      directory
      target
      configureLog
      cache
      cmakeFiles
      toolchains
    )
    foreach(schema_type IN LISTS schema_types)
      set(schema_type_${schema_type} "")
    endforeach()
    foreach(file IN LISTS replies)
      if(file MATCHES "^reply/(index|error)-")
        list(APPEND schema_type_index ${prefix}/${file})
      else()
        foreach(schema_type IN LISTS schema_types)
          if(file MATCHES "^reply/${schema_type}-")
            list(APPEND schema_type_${schema_type} ${prefix}/${file})
          endif()
        endforeach()
      endif()
    endforeach()
    foreach(schema_type IN LISTS schema_types)
      validate_fileapi_schema(
        ${schema_dir}/schema_${schema_type}.json
        ${schema_type_${schema_type}}
      )
    endforeach()
  endif()
  return(PROPAGATE RunCMake_TEST_FAILED)
endfunction()

function(check_stateful_queries)
  if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE OR NOT CMake_TEST_JSON_SCHEMA)
    return()
  endif()

  cmake_path(SET schema_dir NORMALIZE
    ${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api
  )
  set(prefix ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query/client)
  list(TRANSFORM ARGN
    REPLACE "^(.+)$" "${prefix}-\\1/query.json"
    OUTPUT_VARIABLE query_json_files
  )
  validate_fileapi_schema(
    ${schema_dir}/schema_stateful_query.json
    ${query_json_files}
  )
  return(PROPAGATE RunCMake_TEST_FAILED)
endfunction()

function(check_python case prefix)
  if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE)
    return()
  endif()
  file(GLOB index ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply/${prefix}-*.json)
  execute_process(
    COMMAND ${Python_EXECUTABLE} "${RunCMake_SOURCE_DIR}/${case}-check.py" "${index}" "${CMAKE_CXX_COMPILER_ID}"
      "${RunCMake_TEST_BINARY_DIR}"
    RESULT_VARIABLE result
    OUTPUT_VARIABLE output
    ERROR_VARIABLE output
    )
  if(NOT result EQUAL 0)
    string(REPLACE "\n" "\n  " output "  ${output}")
    set(RunCMake_TEST_FAILED "Unexpected index:\n${output}" PARENT_SCOPE)
  endif()
endfunction()

if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  set(RunCMake_TEST_OPTIONS "-DCMAKE_CONFIGURATION_TYPES=Debug\\;Release\\;MinSizeRel\\;RelWithDebInfo")
endif()

if(JsonCpp_VERSION AND JsonCpp_VERSION VERSION_LESS 1.7.5)
  set(ENV{CMake_JSONCPP_PRE_1_7_5} 1)
endif()

run_cmake(Nothing)
run_cmake(Empty)
run_cmake(EmptyClient)
run_cmake(Stale)
run_cmake(SharedStateless)
run_cmake(ClientStateless)
run_cmake(MixedStateless)
run_cmake(DuplicateStateless)
run_cmake(ClientStateful)
run_cmake(ProjectQueryGood)
run_cmake(ProjectQueryBad)
run_cmake(FailConfigure)

function(run_object object)
  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${object}-build)
  list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0118=NEW)
  run_cmake(${object})
  list(POP_BACK RunCMake_TEST_OPTIONS)
  set(RunCMake_TEST_NO_CLEAN 1)
  run_cmake_command(${object}-SharedStateless ${CMAKE_COMMAND} .)
  run_cmake_command(${object}-ClientStateless ${CMAKE_COMMAND} .)
  run_cmake_command(${object}-ClientStateful ${CMAKE_COMMAND} .)
  run_cmake_command(${object}-FailConfigure ${CMAKE_COMMAND} . -DFAIL=1)
endfunction()

run_object(codemodel-v2)
run_object(configureLog-v1)
run_object(cache-v2)
run_object(cmakeFiles-v1)
run_object(toolchains-v1)
