blob: 20d9a68f85b1945efb156d59ed7b1de6b61279ed [file]
set(expected_json [=[[
{"path": "all-languages"},
{"path": "c-only", "languages": ["C"]},
{"path": "common"},
{"path": "cxx-id", "languages": ["CXX"]},
{"path": "cxx-only", "languages": ["CXX"]},
{"path": "lang-C", "languages": ["C"]},
{"path": "lang-CXX", "languages": ["CXX"]},
{"path": "mixed", "languages": ["C"]},
{"path": "mixed", "isSystem": true, "languages": ["CXX"]},
{"path": "system-C", "isSystem": true, "languages": ["C"]},
{"path": "system-CXX", "isSystem": true, "languages": ["CXX"]},
{"path": "system-common", "isSystem": true},
{"path": "system-cxx-id", "isSystem": true, "languages": ["CXX"]}
]]=])
file(READ "${RunCMake_TEST_BINARY_DIR}/enabled-languages.txt" enabled_languages)
set(extra_languages ${enabled_languages})
list(REMOVE_ITEM extra_languages C CXX)
set(non_cxx_languages ${enabled_languages})
list(REMOVE_ITEM non_cxx_languages CXX)
list(SORT non_cxx_languages)
string(REPLACE ";" "\", \"" non_cxx_languages "${non_cxx_languages}")
foreach(language IN LISTS extra_languages)
string(JSON index LENGTH "${expected_json}")
string(JSON expected_json SET "${expected_json}" ${index}
"{\"path\": \"lang-${language}\", \"languages\": [\"${language}\"]}")
endforeach()
string(JSON expected_count LENGTH "${expected_json}")
math(EXPR last "${expected_count} - 1")
set(expected_entries)
foreach(index RANGE 0 ${last})
string(JSON entry GET "${expected_json}" ${index})
string(JSON path GET "${entry}" path)
if(path STREQUAL "all-languages" AND extra_languages)
string(JSON entry SET "${entry}" languages "[\"C\", \"CXX\"]")
elseif(path STREQUAL "mixed")
string(JSON is_system ERROR_VARIABLE error GET "${entry}" isSystem)
if(error)
string(JSON entry SET "${entry}" languages "[\"${non_cxx_languages}\"]")
endif()
endif()
string(JSON expected_json SET "${expected_json}" ${index} "${entry}")
list(APPEND expected_entries "${entry}")
endforeach()
foreach(target IN ITEMS concrete headers imported)
file(GLOB replies "${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply/target-${target}-*.json")
if(NOT replies)
set(RunCMake_TEST_FAILED
"No File API reply for ${target} in ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply\nEnabled languages: ${enabled_languages}")
return()
endif()
validate_json_schema("${RunCMake_SOURCE_DIR}/../../../Help/manual/file_api/schema_target.json" "${replies}")
foreach(reply IN LISTS replies)
file(READ "${reply}" contents)
string(JSON actual_json ERROR_VARIABLE json_error GET "${contents}" interfaceIncludes)
if(json_error)
set(actual_json "Unable to read interfaceIncludes: ${json_error}")
endif()
set(diagnostics
"Enabled languages: ${enabled_languages}\nExpected interfaceIncludes (paths relative to ${RunCMake_TEST_BINARY_DIR}/include):\n${expected_json}\nActual interfaceIncludes:\n${actual_json}")
string(JSON count ERROR_VARIABLE error LENGTH "${contents}" interfaceIncludes)
if(error OR NOT count EQUAL expected_count)
set(RunCMake_TEST_FAILED "Expected ${expected_count} interface include entries in ${reply}, got ${count}\n${diagnostics}")
return()
endif()
set(remaining_entries "${expected_entries}")
foreach(index RANGE 0 ${last})
string(JSON path GET "${contents}" interfaceIncludes ${index} path)
cmake_path(GET path FILENAME dir)
if(NOT path STREQUAL "${RunCMake_TEST_BINARY_DIR}/include/${dir}")
set(RunCMake_TEST_FAILED "Unexpected interface include path at index ${index} in ${reply}: ${path}\n${diagnostics}")
return()
endif()
string(JSON entry GET "${contents}" interfaceIncludes ${index})
string(JSON entry SET "${entry}" path "\"${dir}\"")
list(FIND remaining_entries "${entry}" match)
if(match EQUAL -1)
set(RunCMake_TEST_FAILED "Unexpected or duplicate interface include entry at index ${index} in ${reply}:\n${entry}\n${diagnostics}")
return()
endif()
list(REMOVE_AT remaining_entries ${match})
endforeach()
endforeach()
endforeach()