test: cover builtin shader manifest resolution outside project cwd

This commit is contained in:
2026-04-02 23:35:50 +08:00
parent ca019157be
commit b43d4048b8

View File

@@ -426,4 +426,69 @@ TEST(ShaderLoader, ResourceManagerLazilyLoadsBuiltinForwardLitShader) {
manager.Shutdown(); 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<Shader> shaderHandle = manager.Load<Shader>(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 } // namespace