# Copyright (c) 2016 The Khronos Group Inc.
#
# 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(VAL_TEST_COMMON_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/../test_fixture.h
  ${CMAKE_CURRENT_SOURCE_DIR}/../unit_spirv.h
  ${CMAKE_CURRENT_SOURCE_DIR}/val_code_generator.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/val_code_generator.h
  ${CMAKE_CURRENT_SOURCE_DIR}/val_fixtures.h
)

add_spvtools_unittest(TARGET val_abcde
  SRCS
       val_adjacency_test.cpp
       val_arithmetics_test.cpp
       val_atomics_test.cpp
       val_barriers_test.cpp
       val_bitwise_test.cpp
       val_builtins_test.cpp
       val_cfg_test.cpp
       val_composites_test.cpp
       val_constants_test.cpp
       val_conversion_test.cpp
       val_data_test.cpp
       val_decoration_test.cpp
       val_derivatives_test.cpp
       val_entry_point.cpp
       val_explicit_reserved_test.cpp
       val_extensions_test.cpp
       val_extension_spv_khr_expect_assume.cpp
       val_extension_spv_khr_linkonce_odr.cpp
       val_extension_spv_khr_subgroup_uniform_control_flow.cpp
       val_extension_spv_khr_integer_dot_product.cpp
       val_extension_spv_khr_terminate_invocation.cpp
       val_ext_inst_test.cpp
       ${VAL_TEST_COMMON_SRCS}
  LIBS ${SPIRV_TOOLS_FULL_VISIBILITY}
  PCH_FILE pch_test_val
)

add_spvtools_unittest(TARGET val_capability
  SRCS
       val_capability_test.cpp
  LIBS ${SPIRV_TOOLS_FULL_VISIBILITY}
  PCH_FILE pch_test_val
)

add_spvtools_unittest(TARGET val_limits
  SRCS val_limits_test.cpp
       ${VAL_TEST_COMMON_SRCS}
  LIBS ${SPIRV_TOOLS_FULL_VISIBILITY}
  PCH_FILE pch_test_val
)

add_spvtools_unittest(TARGET val_fghijklmnop
  SRCS
       val_function_test.cpp
       val_id_test.cpp
       val_image_test.cpp
       val_interfaces_test.cpp
       val_layout_test.cpp
       val_literals_test.cpp
       val_logicals_test.cpp
       val_memory_test.cpp
       val_misc_test.cpp
       val_modes_test.cpp
       val_non_semantic_test.cpp
       val_non_uniform_test.cpp
       val_opencl_test.cpp
       val_primitives_test.cpp
       ${VAL_TEST_COMMON_SRCS}
  LIBS ${SPIRV_TOOLS_FULL_VISIBILITY}
  PCH_FILE pch_test_val
)

add_spvtools_unittest(TARGET val_stuvw
  SRCS
       val_small_type_uses_test.cpp
       val_ssa_test.cpp
       val_state_test.cpp
       val_storage_test.cpp
       val_type_unique_test.cpp
       val_validation_state_test.cpp
       val_version_test.cpp
       ${VAL_TEST_COMMON_SRCS}
  LIBS ${SPIRV_TOOLS_FULL_VISIBILITY}
  PCH_FILE pch_test_val
)
