# Copyright 2020 The SwiftShader Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set(ROOT_PROJECT_COMPILE_OPTIONS
    ${WARNINGS_AS_ERRORS}
)

set(ROOT_PROJECT_LINK_LIBRARIES
    ${OS_LIBS}
    ${SWIFTSHADER_LIBS}
)

set(VULKAN_UNIT_TESTS_SRC_FILES
    BasicTests.cpp
    ComputeTests.cpp
    Device.cpp
    Device.hpp
    DrawTests.cpp
    Driver.cpp
    Driver.hpp
    main.cpp
    VkGlobalFuncs.hpp
    VkInstanceFuncs.hpp
)

add_executable(vk-unittests
    ${VULKAN_UNIT_TESTS_SRC_FILES}
)

# vk-unittests loads vk_swiftshader, so make sure it gets built first
add_dependencies(vk-unittests
    vk_swiftshader
)

set_target_properties(vk-unittests PROPERTIES
    FOLDER "Tests"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)

target_include_directories(vk-unittests
    PRIVATE
        "${SWIFTSHADER_DIR}/include"
)

target_compile_definitions(vk-unittests
    PRIVATE
        "STANDALONE"
)

target_compile_options(vk-unittests
    PRIVATE
        ${ROOT_PROJECT_COMPILE_OPTIONS}
)

target_link_options(vk-unittests
    PRIVATE
        ${SWIFTSHADER_LINK_FLAGS}
)

target_link_libraries(vk-unittests
    PRIVATE
        gtest
        gmock
        SPIRV-Tools
        VulkanWrapper
        ${ROOT_PROJECT_LINK_LIBRARIES}
)
