// 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 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 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]); } }