# SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Find or download Google Test include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/refs/tags/v1.17.0.zip ) FetchContent_MakeAvailable(googletest) set(TEST_TARGETS shadps4_settings_test shadps4_gcn_test) set(SETTINGS_TEST_SOURCES # Under test ${CMAKE_SOURCE_DIR}/src/core/emulator_settings.cpp ${CMAKE_SOURCE_DIR}/src/core/emulator_state.cpp # Minimal common support ${CMAKE_SOURCE_DIR}/src/common/path_util.cpp ${CMAKE_SOURCE_DIR}/src/common/assert.cpp ${CMAKE_SOURCE_DIR}/src/common/error.cpp ${CMAKE_SOURCE_DIR}/src/common/string_util.cpp ${CMAKE_SOURCE_DIR}/src/common/logging/log.cpp # Stubs that replace dependencies stubs/common_stub.cpp stubs/scm_rev_stub.cpp stubs/sdl_stub.cpp # Tests test_emulator_settings.cpp ) set(GCN_TEST_SOURCES # Under test ${CMAKE_SOURCE_DIR}/src/core/emulator_settings.cpp ${CMAKE_SOURCE_DIR}/src/core/emulator_state.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_select.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/backend/spirv/spirv_emit_context.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/format.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/decode.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/decode.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/fetch_shader.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/fetch_shader.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/data_share.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/export.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/translate.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/translate.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/scalar_alu.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/scalar_flow.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/scalar_memory.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/vector_alu.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/vector_interpolation.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/frontend/translate/vector_memory.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/abstract_syntax_list.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/abstract_syntax_list.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/basic_block.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/basic_block.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/microinstruction.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/attribute.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/attribute.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/ir_emitter.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/ir_emitter.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/opcodes.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/opcodes.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/patch.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/patch.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/program.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/program.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/passes/ir_passes.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/passes/dead_code_elimination_pass.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/passes/identity_removal_pass.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/post_order.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/post_order.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/type.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/type.h ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/value.cpp ${CMAKE_SOURCE_DIR}/src/shader_recompiler/ir/value.h ${CMAKE_SOURCE_DIR}/src/video_core/amdgpu/pixel_format.cpp ${CMAKE_SOURCE_DIR}/src/video_core/amdgpu/pixel_format.h ${CMAKE_SOURCE_DIR}/src/video_core/amdgpu/resource.h # Minimal common support ${CMAKE_SOURCE_DIR}/src/common/path_util.cpp ${CMAKE_SOURCE_DIR}/src/common/assert.cpp ${CMAKE_SOURCE_DIR}/src/common/error.cpp ${CMAKE_SOURCE_DIR}/src/common/io_file.cpp ${CMAKE_SOURCE_DIR}/src/common/string_util.cpp ${CMAKE_SOURCE_DIR}/src/common/logging/log.cpp ${CMAKE_SOURCE_DIR}/src/common/ntapi.cpp # Stubs that replace dependencies stubs/common_stub.cpp stubs/resource_tracking_pass_stub.cpp stubs/scm_rev_stub.cpp gcn/gcn_test_runner.hpp gcn/gcn_test_runner.cpp gcn/translator.hpp gcn/translator.cpp # Tests gcn/test_gcn_instructions.cpp ) add_executable(shadps4_settings_test ${SETTINGS_TEST_SOURCES}) add_executable(shadps4_gcn_test ${GCN_TEST_SOURCES}) foreach(t ${TEST_TARGETS}) target_include_directories(${t} PRIVATE ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR} ) target_compile_features(${t} PRIVATE cxx_std_23) target_compile_definitions(${t} PRIVATE BOOST_ASIO_STANDALONE) endforeach() target_link_libraries(shadps4_settings_test PRIVATE GTest::gtest_main fmt::fmt nlohmann_json::nlohmann_json toml11::toml11 SDL3::SDL3 spdlog::spdlog ) target_link_libraries(shadps4_gcn_test PRIVATE GTest::gtest_main fmt::fmt nlohmann_json::nlohmann_json magic_enum::magic_enum toml11::toml11 Boost::headers Vulkan::Headers sirit SDL3::SDL3 spdlog::spdlog half::half ) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") include(CheckCXXSymbolExists) check_cxx_symbol_exists(_LIBCPP_VERSION version LIBCPP) if (LIBCPP) foreach(t ${TEST_TARGETS}) target_compile_options(${t} PRIVATE -fexperimental-library) endforeach() endif() endif() foreach(t ${TEST_TARGETS}) if (WIN32) target_link_libraries(${t} PRIVATE onecore) target_compile_definitions(${t} PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN NTDDI_VERSION=0x0A000006 _WIN32_WINNT=0x0A00 WINVER=0x0A00 ) if (MSVC) target_compile_definitions(${t} PRIVATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _SCL_SECURE_NO_WARNINGS _TIMESPEC_DEFINED ) endif() endif() endforeach() include(GoogleTest) foreach(t ${TEST_TARGETS}) gtest_discover_tests(${t} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} PROPERTIES TIMEOUT 60 ) endforeach() # =========================================================================== # HTTP tests (libSceHttp - URI helpers and status-line parsing) # =========================================================================== # Self-contained block - mirrors the structure of the targets above so the # new test does not depend on any earlier foreach iterations. set(HTTP_TEST_SOURCES # Under test ${CMAKE_SOURCE_DIR}/src/core/libraries/network/http.cpp # Required to link RegisterLib's LIB_FUNCTION calls and the logger's # access to EmulatorSettings. ${CMAKE_SOURCE_DIR}/src/core/emulator_settings.cpp ${CMAKE_SOURCE_DIR}/src/core/emulator_state.cpp # Minimal common support ${CMAKE_SOURCE_DIR}/src/common/path_util.cpp ${CMAKE_SOURCE_DIR}/src/common/assert.cpp ${CMAKE_SOURCE_DIR}/src/common/error.cpp ${CMAKE_SOURCE_DIR}/src/common/string_util.cpp ${CMAKE_SOURCE_DIR}/src/common/logging/log.cpp # Stubs that replace dependencies stubs/common_stub.cpp stubs/scm_rev_stub.cpp stubs/sdl_stub.cpp stubs/loader_stub.cpp # Tests network/test_http_uri.cpp network/test_http_status_line.cpp network/test_http_parse_response_header.cpp ) add_executable(shadps4_http_test ${HTTP_TEST_SOURCES}) list(APPEND TEST_TARGETS shadps4_http_test) target_include_directories(shadps4_http_test PRIVATE ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR} ) target_compile_features(shadps4_http_test PRIVATE cxx_std_23) target_compile_definitions(shadps4_http_test PRIVATE BOOST_ASIO_STANDALONE) target_link_libraries(shadps4_http_test PRIVATE GTest::gtest_main fmt::fmt magic_enum::magic_enum nlohmann_json::nlohmann_json toml11::toml11 SDL3::SDL3 spdlog::spdlog ) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") include(CheckCXXSymbolExists) check_cxx_symbol_exists(_LIBCPP_VERSION version LIBCPP) if (LIBCPP) target_compile_options(shadps4_http_test PRIVATE -fexperimental-library) endif() endif() if (WIN32) target_link_libraries(shadps4_http_test PRIVATE onecore) target_compile_definitions(shadps4_http_test PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN NTDDI_VERSION=0x0A000006 _WIN32_WINNT=0x0A00 WINVER=0x0A00 ) if (MSVC) target_compile_definitions(shadps4_http_test PRIVATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _SCL_SECURE_NO_WARNINGS _TIMESPEC_DEFINED ) endif() endif() gtest_discover_tests(shadps4_http_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR} PROPERTIES TIMEOUT 60 )