# Copyright (c) 2019 Google LLC
#
# 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.

if (${SPIRV_BUILD_FUZZER})

  set(SOURCES
          fuzz_test_util.h

          data_synonym_transformation_test.cpp
          equivalence_relation_test.cpp
          fact_manager_test.cpp
          fuzz_test_util.cpp
          fuzzer_pass_construct_composites_test.cpp
          fuzzer_pass_donate_modules_test.cpp
          instruction_descriptor_test.cpp
          replayer_test.cpp
          transformation_access_chain_test.cpp
          transformation_add_constant_boolean_test.cpp
          transformation_add_constant_composite_test.cpp
          transformation_add_constant_null_test.cpp
          transformation_add_constant_scalar_test.cpp
          transformation_add_copy_memory_test.cpp
          transformation_add_dead_block_test.cpp
          transformation_add_dead_break_test.cpp
          transformation_add_dead_continue_test.cpp
          transformation_add_function_test.cpp
          transformation_add_global_undef_test.cpp
          transformation_add_global_variable_test.cpp
          transformation_add_image_sample_unused_components_test.cpp
          transformation_add_local_variable_test.cpp
          transformation_add_no_contraction_decoration_test.cpp
          transformation_add_parameter_test.cpp
          transformation_add_synonym_test.cpp
          transformation_add_type_array_test.cpp
          transformation_add_type_boolean_test.cpp
          transformation_add_type_float_test.cpp
          transformation_add_type_function_test.cpp
          transformation_add_type_int_test.cpp
          transformation_add_type_matrix_test.cpp
          transformation_add_type_pointer_test.cpp
          transformation_add_type_struct_test.cpp
          transformation_add_type_vector_test.cpp
          transformation_adjust_branch_weights_test.cpp
          transformation_composite_construct_test.cpp
          transformation_composite_extract_test.cpp
          transformation_compute_data_synonym_fact_closure_test.cpp
          transformation_equation_instruction_test.cpp
          transformation_function_call_test.cpp
          transformation_invert_comparison_operator_test.cpp
          transformation_load_test.cpp
          transformation_merge_blocks_test.cpp
          transformation_move_block_down_test.cpp
          transformation_outline_function_test.cpp
          transformation_permute_function_parameters_test.cpp
          transformation_permute_phi_operands_test.cpp
          transformation_push_id_through_variable_test.cpp
          transformation_replace_parameter_with_global_test.cpp
          transformation_replace_boolean_constant_with_constant_binary_test.cpp
          transformation_replace_constant_with_uniform_test.cpp
          transformation_replace_id_with_synonym_test.cpp
          transformation_replace_linear_algebra_instruction_test.cpp
          transformation_set_function_control_test.cpp
          transformation_set_loop_control_test.cpp
          transformation_set_memory_operands_mask_test.cpp
          transformation_set_selection_control_test.cpp
          transformation_split_block_test.cpp
          transformation_store_test.cpp
          transformation_swap_commutable_operands_test.cpp
          transformation_swap_conditional_branch_operands_test.cpp
          transformation_toggle_access_chain_instruction_test.cpp
          transformation_record_synonymous_constants_test.cpp
          transformation_vector_shuffle_test.cpp
          uniform_buffer_element_descriptor_test.cpp)

  if (${SPIRV_ENABLE_LONG_FUZZER_TESTS})
    # These are long-running tests that depend on random seeds.  We do not want
    # to run them during regular whole-project CI because they may reveal
    # spirv-fuzz bugs in changes that are totally unrelated to spirv-fuzz,
    # which would be counfounding.  Instead, they should be run regularly but
    # separately.
    set(SOURCES ${SOURCES}
            fuzzer_replayer_test.cpp
            fuzzer_shrinker_test.cpp)
  endif()

  add_spvtools_unittest(TARGET fuzz
        SRCS ${SOURCES}
        LIBS SPIRV-Tools-fuzz
        )
endif()
