mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 14:25:02 +00:00
Import SDL3CPlusPlus C++ game engine with: - SDL3 + bgfx rendering backend - Vulkan/Metal/DirectX shader support - MaterialX material system - Scene framework with ECS architecture - Comprehensive test suite (TDD approach) - Conan package management - CMake build system This provides the native C++ foundation for the Universal Platform's Game and 3D capability modules. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
96 lines
3.1 KiB
C++
96 lines
3.1 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include "services/impl/render/render_graph_service.hpp"
|
|
|
|
namespace {
|
|
|
|
bool HasDiagnosticCode(const std::vector<sdl3cpp::services::ProbeReport>& diagnostics,
|
|
const std::string& code) {
|
|
for (const auto& report : diagnostics) {
|
|
if (report.code == code) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
sdl3cpp::services::RenderPassIR MakePass(const std::string& id,
|
|
const std::string& inputPassId = {}) {
|
|
sdl3cpp::services::RenderPassIR pass;
|
|
pass.id = id;
|
|
pass.jsonPath = "/render/passes/" + id;
|
|
if (!inputPassId.empty()) {
|
|
sdl3cpp::services::RenderPassInputIR input;
|
|
input.name = "color";
|
|
input.jsonPath = pass.jsonPath + "/inputs/color";
|
|
input.ref.type = sdl3cpp::services::RenderResourceRefType::PassOutput;
|
|
input.ref.passId = inputPassId;
|
|
input.ref.outputName = "output";
|
|
input.ref.jsonPath = input.jsonPath;
|
|
pass.inputs.push_back(input);
|
|
}
|
|
return pass;
|
|
}
|
|
|
|
TEST(RenderGraphServiceTest, EmptyGraphSucceeds) {
|
|
sdl3cpp::services::RenderGraphIR graph;
|
|
sdl3cpp::services::impl::RenderGraphService service(nullptr);
|
|
auto result = service.BuildGraph(graph);
|
|
|
|
EXPECT_TRUE(result.success);
|
|
EXPECT_TRUE(result.passOrder.empty());
|
|
EXPECT_TRUE(result.diagnostics.empty());
|
|
}
|
|
|
|
TEST(RenderGraphServiceTest, ValidDependencyOrdersPasses) {
|
|
sdl3cpp::services::RenderGraphIR graph;
|
|
graph.passes.push_back(MakePass("gbuffer"));
|
|
graph.passes.push_back(MakePass("tonemap", "gbuffer"));
|
|
|
|
sdl3cpp::services::impl::RenderGraphService service(nullptr);
|
|
auto result = service.BuildGraph(graph);
|
|
|
|
ASSERT_TRUE(result.success);
|
|
ASSERT_EQ(result.passOrder.size(), 2u);
|
|
EXPECT_EQ(result.passOrder[0], "gbuffer");
|
|
EXPECT_EQ(result.passOrder[1], "tonemap");
|
|
}
|
|
|
|
TEST(RenderGraphServiceTest, DetectsUnknownPassInput) {
|
|
sdl3cpp::services::RenderGraphIR graph;
|
|
graph.passes.push_back(MakePass("main", "missing"));
|
|
|
|
sdl3cpp::services::impl::RenderGraphService service(nullptr);
|
|
auto result = service.BuildGraph(graph);
|
|
|
|
EXPECT_FALSE(result.success);
|
|
EXPECT_TRUE(HasDiagnosticCode(result.diagnostics, "RG_INPUT_UNKNOWN_PASS"));
|
|
}
|
|
|
|
TEST(RenderGraphServiceTest, DetectsDuplicatePassIds) {
|
|
sdl3cpp::services::RenderGraphIR graph;
|
|
graph.passes.push_back(MakePass("main"));
|
|
graph.passes.push_back(MakePass("main"));
|
|
|
|
sdl3cpp::services::impl::RenderGraphService service(nullptr);
|
|
auto result = service.BuildGraph(graph);
|
|
|
|
EXPECT_FALSE(result.success);
|
|
EXPECT_TRUE(HasDiagnosticCode(result.diagnostics, "RG_PASS_ID_DUPLICATE"));
|
|
}
|
|
|
|
TEST(RenderGraphServiceTest, DetectsCycles) {
|
|
sdl3cpp::services::RenderGraphIR graph;
|
|
graph.passes.push_back(MakePass("a", "b"));
|
|
graph.passes.push_back(MakePass("b", "a"));
|
|
|
|
sdl3cpp::services::impl::RenderGraphService service(nullptr);
|
|
auto result = service.BuildGraph(graph);
|
|
|
|
EXPECT_FALSE(result.success);
|
|
EXPECT_TRUE(HasDiagnosticCode(result.diagnostics, "RG_CYCLE_DETECTED"));
|
|
EXPECT_LT(result.passOrder.size(), graph.passes.size());
|
|
}
|
|
|
|
} // namespace
|