#include #include #include namespace { using XCEngine::Rendering::Passes::BuildBuiltinPostProcessPassPlan; using XCEngine::Rendering::Passes::BuiltinPostProcessPassPlanInput; using XCEngine::Rendering::Passes::BuiltinPostProcessPassStep; TEST(BuiltinPostProcessPassPlan_Test, ReturnsInvalidPlanWhenNoBuiltinEffectIsAvailable) { const auto plan = BuildBuiltinPostProcessPassPlan({}); EXPECT_FALSE(plan.valid); EXPECT_TRUE(plan.steps.empty()); } TEST(BuiltinPostProcessPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) { BuiltinPostProcessPassPlanInput input = {}; input.hasGridOverlay = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::InfiniteGrid, BuiltinPostProcessPassStep::ColorToShaderResource })); } TEST(BuiltinPostProcessPassPlan_Test, BuildsGridAndSelectionOutlinePlanWhenObjectIdShaderViewExists) { BuiltinPostProcessPassPlanInput input = {}; input.hasGridOverlay = true; input.hasSelection = true; input.hasObjectIdShaderView = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::InfiniteGrid, BuiltinPostProcessPassStep::SelectionOutline, BuiltinPostProcessPassStep::ColorToShaderResource })); } TEST(BuiltinPostProcessPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissingAndGridExists) { BuiltinPostProcessPassPlanInput input = {}; input.hasGridOverlay = true; input.hasSelection = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::InfiniteGrid, BuiltinPostProcessPassStep::ColorToShaderResource })); } TEST(BuiltinPostProcessPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) { BuiltinPostProcessPassPlanInput input = {}; input.hasGridOverlay = true; input.hasSelection = true; input.debugSelectionMask = true; input.hasObjectIdShaderView = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::SelectionMaskDebug, BuiltinPostProcessPassStep::ColorToShaderResource })); } TEST(BuiltinPostProcessPassPlan_Test, DebugMaskPlanFallsBackToTransitionsWhenGridExistsButObjectIdShaderViewIsMissing) { BuiltinPostProcessPassPlanInput input = {}; input.hasGridOverlay = true; input.hasSelection = true; input.debugSelectionMask = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::ColorToShaderResource })); } TEST(BuiltinPostProcessPassPlan_Test, BuildsSelectionOnlyOutlinePlanWhenGridOverlayIsUnavailable) { BuiltinPostProcessPassPlanInput input = {}; input.hasSelection = true; input.hasObjectIdShaderView = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::SelectionOutline, BuiltinPostProcessPassStep::ColorToShaderResource })); } TEST(BuiltinPostProcessPassPlan_Test, BuildsDebugMaskWithoutGridWhenObjectIdShaderViewExists) { BuiltinPostProcessPassPlanInput input = {}; input.hasSelection = true; input.debugSelectionMask = true; input.hasObjectIdShaderView = true; const auto plan = BuildBuiltinPostProcessPassPlan(input); ASSERT_TRUE(plan.valid); EXPECT_EQ( plan.steps, (std::vector{ BuiltinPostProcessPassStep::ColorToRenderTarget, BuiltinPostProcessPassStep::SelectionMaskDebug, BuiltinPostProcessPassStep::ColorToShaderResource })); } } // namespace