Files
2025-05-18 13:04:45 +08:00

703 lines
22 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TestHarness.h"
#include "TestGraphBuilder.h"
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Create::Single Island", "[graph][island]")
{
PopulateVertices(2, true);
BuildLinearEdges(2);
FinalizeEdges();
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
CHECK(Island->Handle() == IslandHandles[0]);
CHECK(Island->IsEmpty() == false);
CHECK(Island->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island->Num() == 2);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Create::Two Islands", "[graph][island]")
{
PopulateVertices(4, false);
BuildLinearEdges(2);
FinalizeEdges();
REQUIRE(IslandHandles.Num() == 2);
FGraphIslandHandle IslandHandle1;
{
UGraphVertex* Vertex = VertexHandles[0].GetVertex();
REQUIRE(Vertex != nullptr);
IslandHandle1 = Vertex->GetParentIsland();
}
UGraphIsland* Island1 = IslandHandle1.GetIsland();
REQUIRE(Island1 != nullptr);
{
CHECK(Island1->Handle() == IslandHandle1);
CHECK(Island1->IsEmpty() == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == false);
CHECK(Island1->Num() == 2);
}
FGraphIslandHandle IslandHandle2;
{
UGraphVertex* Vertex = VertexHandles[2].GetVertex();
REQUIRE(Vertex != nullptr);
IslandHandle2 = Vertex->GetParentIsland();
}
CHECK(IslandHandle1 != IslandHandle2);
UGraphIsland* Island2 = IslandHandle2.GetIsland();
REQUIRE(Island2 != nullptr);
{
CHECK(Island2->Handle() == IslandHandle2);
CHECK(Island2->IsEmpty() == false);
CHECK(Island2->GetVertices().Contains(VertexHandles[0]) == false);
CHECK(Island2->GetVertices().Contains(VertexHandles[1]) == false);
CHECK(Island2->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[3]) == true);
CHECK(Island2->Num() == 2);
}
IslandVertexParentIslandSanityCheck(IslandHandle1);
IslandVertexParentIslandSanityCheck(IslandHandle2);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Bulk Create Edges", "[graph][island]")
{
PopulateVertices(10, false);
BuildLinearEdges(2);
{
TArray<FEdgeSpecifier> AllEdgeParams;
{
FEdgeSpecifier Params{ VertexHandles[1], VertexHandles[2] };
AllEdgeParams.Add(Params);
}
{
FEdgeSpecifier Params{ VertexHandles[1], VertexHandles[3] };
AllEdgeParams.Add(Params);
}
{
FEdgeSpecifier Params{ VertexHandles[4], VertexHandles[9] };
AllEdgeParams.Add(Params);
}
{
FEdgeSpecifier Params{ VertexHandles[5], VertexHandles[6] };
AllEdgeParams.Add(Params);
}
{
FEdgeSpecifier Params{ VertexHandles[4], VertexHandles[7] };
AllEdgeParams.Add(Params);
}
Graph->CreateBulkEdges(MoveTemp(AllEdgeParams));
}
FinalizeEdges();
REQUIRE(IslandHandles.Num() == 2);
FGraphIslandHandle IslandHandle1;
{
UGraphVertex* Vertex = VertexHandles[0].GetVertex();
REQUIRE(Vertex != nullptr);
IslandHandle1 = Vertex->GetParentIsland();
}
UGraphIsland* Island1 = IslandHandle1.GetIsland();
REQUIRE(Island1 != nullptr);
{
CHECK(Island1->Handle() == IslandHandle1);
CHECK(Island1->IsEmpty() == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
CHECK(Island1->Num() == 4);
}
FGraphIslandHandle IslandHandle2;
{
UGraphVertex* Vertex = VertexHandles[4].GetVertex();
REQUIRE(Vertex != nullptr);
IslandHandle2 = Vertex->GetParentIsland();
}
CHECK(IslandHandle1 != IslandHandle2);
UGraphIsland* Island2 = IslandHandle2.GetIsland();
REQUIRE(Island2 != nullptr);
{
CHECK(Island2->Handle() == IslandHandle2);
CHECK(Island2->IsEmpty() == false);
CHECK(Island2->GetVertices().Contains(VertexHandles[4]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[5]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[6]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[7]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[8]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[9]) == true);
CHECK(Island2->Num() == 6);
}
IslandVertexParentIslandSanityCheck(IslandHandle1);
IslandVertexParentIslandSanityCheck(IslandHandle2);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Remove Vertex::Still Connected", "[graph][island]")
{
PopulateVertices(4, true);
BuildFullyConnectedEdges(4);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island1 = IslandHandles[0].GetIsland();
REQUIRE(Island1 != nullptr);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
{
CHECK(Island1->Num() == 4);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
}
Graph->RemoveVertex(VertexHandles[0]);
CHECK(Graph->NumIslands() == 1);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
{
CHECK(Island1->Num() == 3);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
}
Graph->RemoveVertex(VertexHandles[1]);
CHECK(Graph->NumIslands() == 1);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
{
CHECK(Island1->Num() == 2);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
}
Graph->RemoveVertex(VertexHandles[2]);
CHECK(Graph->NumIslands() == 1);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
{
CHECK(Island1->Num() == 1);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
}
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
CHECK(Graph->NumIslands() == 1);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Remove Vertex::Split", "[graph][island]")
{
PopulateVertices(4, true);
BuildLinearEdges(4);
REQUIRE(IslandHandles.Num() == 1);
CHECK(Graph->NumIslands() == 1);
Graph->RemoveVertex(VertexHandles[1]);
FinalizeEdges();
REQUIRE(IslandHandles.Num() == 2);
CHECK(Graph->NumIslands() == 2);
FGraphIslandHandle IslandHandle1;
{
UGraphVertex* Vertex = VertexHandles[0].GetVertex();
REQUIRE(Vertex != nullptr);
IslandHandle1 = Vertex->GetParentIsland();
}
UGraphIsland* Island1 = IslandHandle1.GetIsland();
REQUIRE(Island1 != nullptr);
{
CHECK(Island1->Handle() == IslandHandle1);
CHECK(Island1->IsEmpty() == false);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island1->Num() == 1);
}
FGraphIslandHandle IslandHandle2;
{
UGraphVertex* Vertex = VertexHandles[2].GetVertex();
REQUIRE(Vertex != nullptr);
IslandHandle2 = Vertex->GetParentIsland();
}
CHECK(IslandHandle1 != IslandHandle2);
UGraphIsland* Island2 = IslandHandle2.GetIsland();
REQUIRE(Island2 != nullptr);
{
CHECK(Island2->Handle() == IslandHandle2);
CHECK(Island2->IsEmpty() == false);
CHECK(Island2->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[3]) == true);
CHECK(Island2->Num() == 2);
}
IslandVertexParentIslandSanityCheck(IslandHandle1);
IslandVertexParentIslandSanityCheck(IslandHandle2);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Operation Allowed::Flag", "[graph][island]")
{
PopulateVertices(2, true);
BuildLinearEdges(2);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
TArray<EGraphIslandOperations> AllFlags =
{
EGraphIslandOperations::Add,
EGraphIslandOperations::Split,
EGraphIslandOperations::Merge,
EGraphIslandOperations::Destroy
};
for (EGraphIslandOperations Flag : AllFlags)
{
CHECK(Island->IsOperationAllowed(Flag) == true);
}
auto RunTest = [&AllFlags, Island](EGraphIslandOperations FlagToDisable)
{
Island->SetOperationAllowed(FlagToDisable, false);
for (EGraphIslandOperations Flag : AllFlags)
{
if (Flag == FlagToDisable)
{
CHECK(Island->IsOperationAllowed(Flag) == false);
}
else
{
CHECK(Island->IsOperationAllowed(Flag) == true);
}
}
Island->SetOperationAllowed(FlagToDisable, true);
for (EGraphIslandOperations Flag : AllFlags)
{
CHECK(Island->IsOperationAllowed(Flag) == true);
}
};
RunTest(EGraphIslandOperations::Add);
RunTest(EGraphIslandOperations::Split);
RunTest(EGraphIslandOperations::Merge);
RunTest(EGraphIslandOperations::Destroy);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Operation Allowed::Disable Add", "[graph][island]")
{
PopulateVertices(4, true);
BuildLinearEdges(4);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Add, false);
FGraphVertexHandle NewVertex = Graph->CreateVertex();
FEdgeSpecifier Params{ NewVertex, VertexHandles[0] };
Graph->CreateBulkEdges({ Params });
CHECK(Island->Num() == 4);
CHECK(Island->GetVertices().Contains(NewVertex) == false);
CHECK(NewVertex.GetVertex()->GetParentIsland() != Island->Handle());
CHECK(NewVertex.GetVertex()->GetParentIsland() == FGraphIslandHandle::Invalid);
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 1);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
CHECK(NewVertex.GetVertex()->HasEdgeTo(VertexHandles[0]) == false);
CHECK(VertexHandles[0].GetVertex()->HasEdgeTo(NewVertex) == false);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Operation Allowed::Disable Split", "[graph][island]")
{
PopulateVertices(6, true);
BuildLinearEdges(6);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Split, false);
CHECK(Island->Num() == 6);
CHECK(Graph->NumVertices() == 6);
CHECK(Graph->NumIslands() == 1);
UGraphVertex* Vertex = VertexHandles[2].GetVertex();
REQUIRE(Vertex != nullptr);
UGraphIsland* Island1 = nullptr;
UGraphIsland* Island2 = nullptr;
SECTION("Remove Vertex")
{
Graph->RemoveVertex(VertexHandles[2]);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
CHECK(Island->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[3]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[4]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[5]) == true);
CHECK(Island->Num() == 5);
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 1);
Island->SetOperationAllowed(EGraphIslandOperations::Split, true);
Graph->RefreshIslandConnectivity(Island->Handle());
Island1 = VertexHandles[0].GetVertex()->GetParentIsland().GetIsland();
Island2 = VertexHandles[5].GetVertex()->GetParentIsland().GetIsland();
CHECK(Island1->Num() == 2);
CHECK(Island1->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island2->Num() == 3);
CHECK(Island2->GetVertices().Contains(VertexHandles[3]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[4]) == true);
CHECK(Island2->GetVertices().Contains(VertexHandles[5]) == true);
CHECK(Graph->NumVertices() == 5);
}
CHECK(Graph->NumIslands() == 2);
IslandVertexParentIslandSanityCheck(Island1->Handle());
IslandVertexParentIslandSanityCheck(Island2->Handle());
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Operation Allowed::Disable Merge::Existing Vertices", "[graph][island]")
{
PopulateVertices(4, true);
BuildLinearEdges(2);
REQUIRE(IslandHandles.Num() == 2);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
IslandVertexParentIslandSanityCheck(IslandHandles[1]);
auto RunTest = [this]()
{
FEdgeSpecifier Params{ VertexHandles[0], VertexHandles[2] };
Graph->CreateBulkEdges({ Params });
CHECK(Graph->NumVertices() == 4);
CHECK(Graph->NumIslands() == 2);
VerifyEdges({ Params }, false);
UGraphIsland* Island0 = VertexHandles[0].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island0 != nullptr);
CHECK(Island0->Num() == 2);
CHECK(Island0->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island0->GetVertices().Contains(VertexHandles[1]) == true);
UGraphIsland* Island1 = VertexHandles[2].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island1 != nullptr);
CHECK(Island1->Num() == 2);
CHECK(Island0->Handle() != Island1->Handle());
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
IslandVertexParentIslandSanityCheck(Island0->Handle());
IslandVertexParentIslandSanityCheck(Island1->Handle());
};
SECTION("Single disable - 1")
{
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Merge, false);
RunTest();
}
SECTION("Single disable - 2")
{
UGraphIsland* Island = IslandHandles[1].GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Merge, false);
RunTest();
}
SECTION("Double disable")
{
UGraphIsland* Island0 = IslandHandles[0].GetIsland();
REQUIRE(Island0 != nullptr);
Island0->SetOperationAllowed(EGraphIslandOperations::Merge, false);
UGraphIsland* Island1 = IslandHandles[1].GetIsland();
REQUIRE(Island1 != nullptr);
Island1->SetOperationAllowed(EGraphIslandOperations::Merge, false);
RunTest();
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Operation Allowed::Disable Merge::New Vertex::Bulk Edges", "[graph][island]")
{
PopulateVertices(4, true);
BuildLinearEdges(2);
REQUIRE(IslandHandles.Num() == 2);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
IslandVertexParentIslandSanityCheck(IslandHandles[1]);
auto RunTest = [this]()
{
FGraphVertexHandle NewVertex = Graph->CreateVertex();
FEdgeSpecifier Params1{VertexHandles[0], NewVertex};
FEdgeSpecifier Params2{VertexHandles[3], NewVertex};
Graph->CreateBulkEdges({ Params1, Params2 });
Graph->FinalizeVertex(NewVertex);
VerifyEdges( { Params1 }, true);
VerifyEdges( { Params2 }, false);
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 2);
UGraphIsland* Island0 = VertexHandles[0].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island0 != nullptr);
CHECK(Island0->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island0->GetVertices().Contains(VertexHandles[1]) == true);
UGraphIsland* Island1 = VertexHandles[2].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island1 != nullptr);
CHECK(Island0->Handle() != Island1->Handle());
CHECK(Island1->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island1->GetVertices().Contains(VertexHandles[3]) == true);
CHECK(Island0->Num() == 3);
CHECK(Island0->GetVertices().Contains(NewVertex) == true);
CHECK(Island1->Num() == 2);
IslandVertexParentIslandSanityCheck(Island0->Handle());
IslandVertexParentIslandSanityCheck(Island1->Handle());
};
SECTION("Single disable - 1")
{
UGraphIsland* Island = VertexHandles[0].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Merge, false);
RunTest();
}
SECTION("Single disable - 2")
{
UGraphIsland* Island = VertexHandles[3].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Merge, false);
RunTest();
}
SECTION("Double disable")
{
UGraphIsland* Island0 = VertexHandles[0].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island0 != nullptr);
Island0->SetOperationAllowed(EGraphIslandOperations::Merge, false);
UGraphIsland* Island1 = VertexHandles[3].GetVertex()->GetParentIsland().GetIsland();
REQUIRE(Island1 != nullptr);
Island1->SetOperationAllowed(EGraphIslandOperations::Merge, false);
RunTest();
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Operation Allowed::Disable Destroy", "[graph][island]")
{
PopulateVertices(4, true);
BuildFullyConnectedEdges(4);
REQUIRE(IslandHandles.Num() == 1);
CHECK(Graph->NumIslands() == 1);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
CHECK(IslandHandles[0].IsComplete());
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
Island->SetOperationAllowed(EGraphIslandOperations::Destroy, false);
Graph->RemoveIsland(IslandHandles[0]);
CHECK(Graph->NumIslands() == 1);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
CHECK(IslandHandles[0].IsComplete());
CHECK(Graph->GetIslands().Contains(IslandHandles[0]) == true);
CHECK(Island->Num() == 4);
CHECK(Island->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[1]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[2]) == true);
CHECK(Island->GetVertices().Contains(VertexHandles[3]) == true);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Events::Vertex Added", "[graph][island]")
{
PopulateVertices(2, true);
BuildLinearEdges(2);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
FGraphIslandHandle CallbackIslandHandle;
FGraphVertexHandle CallbackVertexHandle;
Island->OnVertexAdded.AddLambda(
[&CallbackIslandHandle, &CallbackVertexHandle](const FGraphIslandHandle& InIslandHandle, const FGraphVertexHandle& InVertexHandle)
{
CallbackIslandHandle = InIslandHandle;
CallbackVertexHandle = InVertexHandle;
}
);
FGraphVertexHandle NewVertex = Graph->CreateVertex();
FEdgeSpecifier Params{ NewVertex, VertexHandles[0] };
Graph->CreateBulkEdges({ Params });
CHECK(CallbackIslandHandle == Island->Handle());
CHECK(CallbackVertexHandle == NewVertex);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Events::Vertex Removed", "[graph][island]")
{
PopulateVertices(3, true);
BuildLinearEdges(3);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
FGraphIslandHandle CallbackIslandHandle;
FGraphVertexHandle CallbackVertexHandle;
Island->OnVertexRemoved.AddLambda(
[&CallbackIslandHandle, &CallbackVertexHandle](const FGraphIslandHandle& InIslandHandle, const FGraphVertexHandle& InVertexHandle)
{
CallbackIslandHandle = InIslandHandle;
CallbackVertexHandle = InVertexHandle;
}
);
SECTION("Remove Vertex")
{
Graph->RemoveVertex(VertexHandles[0]);
CHECK(CallbackIslandHandle == Island->Handle());
CHECK(CallbackVertexHandle == VertexHandles[0]);
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Events::On Destroyed", "[graph][island]")
{
PopulateVertices(3, true);
BuildLinearEdges(3);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
FGraphIslandHandle CallbackIslandHandle;
Island->OnDestroyed.AddLambda(
[&CallbackIslandHandle](const FGraphIslandHandle& InIslandHandle)
{
CallbackIslandHandle = InIslandHandle;
}
);
Graph->RemoveIsland(IslandHandles[0]);
CHECK(CallbackIslandHandle == IslandHandles[0]);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Island::Events::On Connectivity Changed", "[graph][island]")
{
PopulateVertices(3, false);
SECTION("Finalize Vertex")
{
FGraphIslandHandle CreatedIslandHandle;
FGraphIslandHandle CallbackIslandHandle;
Graph->OnIslandCreated.AddLambda(
[&CreatedIslandHandle, &CallbackIslandHandle](const FGraphIslandHandle& InIslandHandle)
{
CreatedIslandHandle = InIslandHandle;
UGraphIsland* Island = CreatedIslandHandle.GetIsland();
REQUIRE(Island != nullptr);
Island->OnConnectivityChanged.AddLambda(
[&CallbackIslandHandle](const FGraphIslandHandle& InCallbackIslandHandle, EGraphIslandConnectivityChange Change)
{
CallbackIslandHandle = InCallbackIslandHandle;
}
);
}
);
Graph->FinalizeVertex(VertexHandles[0]);
CHECK(CreatedIslandHandle.IsComplete() == true);
CHECK(CallbackIslandHandle.IsComplete() == true);
CHECK(CreatedIslandHandle == CallbackIslandHandle);
}
SECTION("Split island")
{
FinalizeVertices();
BuildLinearEdges(3);
REQUIRE(IslandHandles.Num() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
IslandVertexParentIslandSanityCheck(IslandHandles[0]);
FGraphIslandHandle CallbackIslandHandle;
Island->OnConnectivityChanged.AddLambda(
[&CallbackIslandHandle](const FGraphIslandHandle& InCallbackIslandHandle, EGraphIslandConnectivityChange Change)
{
CallbackIslandHandle = InCallbackIslandHandle;
}
);
Graph->RemoveVertex(VertexHandles[1]);
CHECK(CallbackIslandHandle.IsComplete());
CHECK(CallbackIslandHandle == IslandHandles[0]);
}
}