From b43d4048b88db84a5d1e07516d1fe615ed69fa25 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Thu, 2 Apr 2026 23:35:50 +0800 Subject: [PATCH] test: cover builtin shader manifest resolution outside project cwd --- tests/Resources/Shader/test_shader_loader.cpp | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/Resources/Shader/test_shader_loader.cpp b/tests/Resources/Shader/test_shader_loader.cpp index a2c7d1c0..e810f6ee 100644 --- a/tests/Resources/Shader/test_shader_loader.cpp +++ b/tests/Resources/Shader/test_shader_loader.cpp @@ -426,4 +426,69 @@ TEST(ShaderLoader, ResourceManagerLazilyLoadsBuiltinForwardLitShader) { manager.Shutdown(); } +TEST(ShaderLoader, ResourceManagerLoadsBuiltinShadersOutsideProjectWorkingDirectory) { + namespace fs = std::filesystem; + + ResourceManager& manager = ResourceManager::Get(); + const fs::path previousPath = fs::current_path(); + const String previousResourceRoot = manager.GetResourceRoot(); + const fs::path isolatedWorkingDirectory = fs::temp_directory_path() / "xc_builtin_shader_out_of_tree"; + + fs::remove_all(isolatedWorkingDirectory); + fs::create_directories(isolatedWorkingDirectory); + + manager.Shutdown(); + manager.SetResourceRoot(""); + fs::current_path(isolatedWorkingDirectory); + + auto expectBuiltinShader = [&](const String& path, + const char* passName, + ShaderType stage, + ShaderBackend backend, + const char* marker) { + const ResourceHandle shaderHandle = manager.Load(path); + EXPECT_TRUE(shaderHandle.IsValid()) << path.CStr(); + if (!shaderHandle.IsValid()) { + return; + } + + EXPECT_NE(shaderHandle->FindPass(passName), nullptr) << path.CStr(); + const ShaderStageVariant* variant = shaderHandle->FindVariant(passName, stage, backend); + EXPECT_NE(variant, nullptr) << path.CStr(); + if (variant != nullptr) { + EXPECT_NE(std::string(variant->sourceCode.CStr()).find(marker), std::string::npos) << path.CStr(); + } + }; + + expectBuiltinShader( + GetBuiltinForwardLitShaderPath(), + "ForwardLit", + ShaderType::Vertex, + ShaderBackend::D3D12, + "XC_BUILTIN_FORWARD_LIT_D3D12_VS"); + expectBuiltinShader( + GetBuiltinObjectIdShaderPath(), + "ObjectId", + ShaderType::Fragment, + ShaderBackend::Vulkan, + "XC_BUILTIN_OBJECT_ID_VULKAN_PS"); + expectBuiltinShader( + GetBuiltinObjectIdOutlineShaderPath(), + "ObjectIdOutline", + ShaderType::Fragment, + ShaderBackend::D3D12, + "XC_BUILTIN_OBJECT_ID_OUTLINE_D3D12_PS"); + expectBuiltinShader( + GetBuiltinInfiniteGridShaderPath(), + "InfiniteGrid", + ShaderType::Fragment, + ShaderBackend::D3D12, + "XC_BUILTIN_INFINITE_GRID_D3D12_PS"); + + fs::current_path(previousPath); + manager.SetResourceRoot(previousResourceRoot); + manager.Shutdown(); + fs::remove_all(isolatedWorkingDirectory); +} + } // namespace