Files
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

616 lines
19 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TestHarness.h"
#include "TestGraphBuilder.h"
TEST_CASE("Graph::Properties::Equality", "[graph][properties]")
{
SECTION("Equality")
{
FGraphProperties Props1;
Props1.bGenerateIslands = true;
FGraphProperties Props2;
Props2.bGenerateIslands = true;
CHECK(Props1 == Props2);
}
SECTION("InEquality")
{
FGraphProperties Props1;
Props1.bGenerateIslands = true;
FGraphProperties Props2;
Props2.bGenerateIslands = false;
CHECK(Props1 != Props2);
}
}
TEST_CASE("Graph::Default Constructor", "[graph]")
{
TObjectPtr<UGraph> Graph = NewObject<UGraph>();
SECTION("State")
{
CHECK(Graph->NumVertices() == 0);
CHECK(Graph->NumIslands() == 0);
}
}
TEST_CASE("Graph::Initialize Properties", "[graph]")
{
TObjectPtr<UGraph> Graph = NewObject<UGraph>();
SECTION("True Islands")
{
FGraphProperties Props1;
Props1.bGenerateIslands = true;
Graph->InitializeFromProperties(Props1);
CHECK(Graph->GetProperties() == Props1);
}
SECTION("False Islands")
{
FGraphProperties Props1;
Props1.bGenerateIslands = false;
Graph->InitializeFromProperties(Props1);
CHECK(Graph->GetProperties() == Props1);
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Create Vertices", "[graph]")
{
FGraphUniqueIndex Node1Index = { FGuid { 1, 1, 1, 1 } };
FGraphVertexHandle Node1 = Graph->CreateVertex(Node1Index);
{
CHECK(Node1.GetUniqueIndex() == Node1Index);
CHECK(Graph->NumVertices() == 1);
CHECK(Graph->NumIslands() == 0);
CHECK(Graph->GetVertices().Contains(Node1) == true);
}
FGraphUniqueIndex Node2Index = { FGuid { 2, 2, 2, 2 } };
FGraphVertexHandle Node2 = Graph->CreateVertex(Node2Index);
{
CHECK(Node2.GetUniqueIndex() == Node2Index);
CHECK(Graph->NumVertices() == 2);
CHECK(Graph->NumIslands() == 0);
CHECK(Graph->GetVertices().Contains(Node2) == true);
}
{
{
FGraphVertexHandle Complete1 = Graph->GetCompleteNodeHandle(FGraphVertexHandle{ Node1Index, Graph });
CHECK(Complete1 == Node1);
CHECK(Complete1.IsValid() == true);
CHECK(Complete1.HasElement() == true);
CHECK(Complete1.IsComplete() == true);
}
{
FGraphVertexHandle Complete2 = Graph->GetCompleteNodeHandle(FGraphVertexHandle{ Node2Index, Graph });
CHECK(Complete2 == Node2);
CHECK(Complete2.IsValid() == true);
CHECK(Complete2.HasElement() == true);
CHECK(Complete2.IsComplete() == true);
}
{
FGraphVertexHandle Complete1 = Graph->GetCompleteNodeHandle(Node1);
CHECK(Complete1 == Node1);
CHECK(Complete1.IsValid() == true);
CHECK(Complete1.HasElement() == true);
CHECK(Complete1.IsComplete() == true);
}
{
FGraphVertexHandle Incomplete = Graph->GetCompleteNodeHandle(FGraphVertexHandle{ FGraphUniqueIndex{ FGuid{ 3, 3, 3, 3 } }, Graph });
CHECK(Incomplete.IsValid() == false);
CHECK(Incomplete.IsComplete() == false);
CHECK(Incomplete.HasElement() == false);
}
{
FGraphVertexHandle Incomplete = Graph->GetCompleteNodeHandle(FGraphVertexHandle{ FGraphUniqueIndex{}, Graph });
CHECK(Incomplete.IsValid() == false);
CHECK(Incomplete.IsComplete() == false);
CHECK(Incomplete.HasElement() == false);
}
}
{
Graph->FinalizeVertex(Node1);
CHECK(Graph->NumVertices() == 2);
CHECK(Graph->NumIslands() == 1);
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Create Vertices::Duplicate", "[graph]")
{
FGraphUniqueIndex Node1Index = { FGuid { 1, 1, 1, 1 } };
FGraphVertexHandle Node1 = Graph->CreateVertex(Node1Index);
{
CHECK(Node1.GetUniqueIndex() == Node1Index);
CHECK(Graph->NumVertices() == 1);
CHECK(Graph->NumIslands() == 0);
CHECK(Graph->GetVertices().Contains(Node1) == true);
}
FGraphVertexHandle Node2 = Graph->CreateVertex(Node1Index);
{
CHECK(Node2.IsValid() == false);
CHECK(Node2.IsComplete() == false);
CHECK(Graph->NumVertices() == 1);
CHECK(Graph->NumIslands() == 0);
CHECK(Graph->GetVertices().Contains(Node2) == false);
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Create Edges::Single", "[graph]")
{
PopulateVertices(4, false);
{
FEdgeSpecifier Params{ VertexHandles[1], VertexHandles[0] };
Graph->CreateBulkEdges({ Params });
CHECK(Graph->NumIslands() == 1);
VerifyEdges({ Params }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[0], {VertexHandles[1]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[1], {VertexHandles[0]});
}
{
FinalizeVertices();
CHECK(Graph->NumIslands() == 3);
}
{
FEdgeSpecifier Params{ VertexHandles[2], VertexHandles[3] };
Graph->CreateBulkEdges({ Params });
CHECK(Graph->NumIslands() == 2);
VerifyEdges({ Params }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[2], {VertexHandles[3]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[3], {VertexHandles[2]});
}
{
FEdgeSpecifier Params{ VertexHandles[0], VertexHandles[2] };
Graph->CreateBulkEdges({ Params });
CHECK(Graph->NumIslands() == 1);
VerifyEdges( { Params }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[0], {VertexHandles[1], VertexHandles[2]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[1], {VertexHandles[0]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[2], {VertexHandles[0], VertexHandles[3]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[3], {VertexHandles[2]});
}
{
FEdgeSpecifier Params{ VertexHandles[0], VertexHandles[2] };
Graph->CreateBulkEdges({ Params });
CHECK(Graph->NumIslands() == 1);
VerifyEdges({ Params }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[0], {VertexHandles[1], VertexHandles[2]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[1], {VertexHandles[0]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[2], {VertexHandles[0], VertexHandles[3]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[3], {VertexHandles[2]});
}
{
FEdgeSpecifier Params{ VertexHandles[2], VertexHandles[0] };
Graph->CreateBulkEdges({ Params });
CHECK(Graph->NumIslands() == 1);
VerifyEdges({ Params }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[0], {VertexHandles[1], VertexHandles[2]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[1], {VertexHandles[0]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[2], {VertexHandles[0], VertexHandles[3]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[3], {VertexHandles[2]});
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Create Edges::Bulk", "[graph]")
{
PopulateVertices(4, true);
{
FEdgeSpecifier Params1{ VertexHandles[1], VertexHandles[0] };
FEdgeSpecifier Params2{ VertexHandles[2], VertexHandles[3] };
FEdgeSpecifier Params3{ VertexHandles[0], VertexHandles[2] };
Graph->CreateBulkEdges({ Params1, Params2, Params3 });
CHECK(Graph->NumIslands() == 1);
VerifyEdges({ Params1, Params2, Params3 }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[0], {VertexHandles[1], VertexHandles[2]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[1], {VertexHandles[0]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[2], {VertexHandles[0], VertexHandles[3]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[3], {VertexHandles[2]});
}
{
FEdgeSpecifier Params1{ VertexHandles[0], VertexHandles[1] };
FEdgeSpecifier Params2{ VertexHandles[3], VertexHandles[2] };
FEdgeSpecifier Params3{ VertexHandles[2], VertexHandles[0] };
Graph->CreateBulkEdges({ Params1, Params2, Params3 });
CHECK(Graph->NumIslands() == 1);
VerifyEdges({ Params1, Params2, Params3 }, true);
VertexShouldOnlyHaveEdgesTo(VertexHandles[0], {VertexHandles[1], VertexHandles[2]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[1], {VertexHandles[0]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[2], {VertexHandles[0], VertexHandles[3]});
VertexShouldOnlyHaveEdgesTo(VertexHandles[3], {VertexHandles[2]});
}
}
class FScopedVertexEdgeCleanupChecker
{
public:
template<typename TIterable>
FScopedVertexEdgeCleanupChecker(UGraph* InGraph, const TIterable& InVertexHandles)
: Graph(InGraph)
{
REQUIRE(Graph != nullptr);
for (const FGraphVertexHandle& VertexHandle : InVertexHandles)
{
UGraphVertex* Vertex = VertexHandle.GetVertex();
REQUIRE(Vertex != nullptr);
Vertex->ForEachAdjacentVertex(
[this, &VertexHandle](const FGraphVertexHandle& NeighborHandle)
{
EdgeHandles.Add(FEdgeSpecifier{VertexHandle, NeighborHandle});
}
);
}
}
~FScopedVertexEdgeCleanupChecker()
{
for (const FEdgeSpecifier& EdgeHandle : EdgeHandles)
{
if (UGraphVertex* V1 = EdgeHandle.GetVertexHandle1().GetVertex())
{
CHECK(V1->HasEdgeTo(EdgeHandle.GetVertexHandle2()) == false);
}
if (UGraphVertex* V2 = EdgeHandle.GetVertexHandle2().GetVertex())
{
CHECK(V2->HasEdgeTo(EdgeHandle.GetVertexHandle1()) == false);
}
}
}
private:
UGraph* Graph;
TArray<FEdgeSpecifier> EdgeHandles;
};
class FScopedVertexIslandCleanupChecker
{
public:
template<typename TIterable>
FScopedVertexIslandCleanupChecker(UGraph* InGraph, const TIterable& InVertexHandles)
: Graph(InGraph)
{
REQUIRE(Graph != nullptr);
for (const FGraphVertexHandle& VertexHandle : InVertexHandles)
{
UGraphVertex* Vertex = VertexHandle.GetVertex();
REQUIRE(Vertex != nullptr);
FGraphIslandHandle ParentIslandHandle = Vertex->GetParentIsland();
CHECK(Graph->GetIslands().Contains(ParentIslandHandle) == true);
CHECK(ParentIslandHandle.IsComplete() == true);
IslandHandles.Add(ParentIslandHandle);
}
}
~FScopedVertexIslandCleanupChecker()
{
for (const FGraphIslandHandle& IslandHandle : IslandHandles)
{
CHECK(Graph->GetIslands().Contains(IslandHandle) == false);
CHECK(IslandHandle.IsComplete() == false);
}
}
private:
UGraph* Graph;
TArray<FGraphIslandHandle> IslandHandles;
};
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Remove Vertex::Single::Fully Connected", "[graph]")
{
PopulateVertices(5, true);
BuildFullyConnectedEdges(5);
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[0] } };
Graph->RemoveVertex(VertexHandles[0]);
}
CHECK(VertexHandles[0].IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[0]).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandles[0]) == false);
CHECK(Graph->NumVertices() == 4);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[1] } };
Graph->RemoveVertex(VertexHandles[1]);
}
CHECK(VertexHandles[1].IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[1]).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandles[1]) == false);
CHECK(Graph->NumVertices() == 3);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[2] } };
Graph->RemoveVertex(VertexHandles[2]);
}
CHECK(VertexHandles[2].IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[2]).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandles[2]) == false);
CHECK(Graph->NumVertices() == 2);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[3] } };
Graph->RemoveVertex(VertexHandles[3]);
}
CHECK(VertexHandles[3].IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[3]).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandles[3]) == false);
CHECK(Graph->NumVertices() == 1);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[4] } };
Graph->RemoveVertex(VertexHandles[4]);
}
CHECK(VertexHandles[4].IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[4]).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandles[4]) == false);
CHECK(Graph->NumVertices() == 0);
CHECK(Graph->NumIslands() == 0);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Remove Vertex::Single::Linear", "[graph]")
{
PopulateVertices(10, true);
BuildLinearEdges(10);
CHECK(Graph->NumVertices() == 10);
CHECK(Graph->NumIslands() == 1);
SECTION("First Vertex")
{
CHECK(Graph->GetVertices().Contains(VertexHandles[0]) == true);
CHECK(VertexHandles[0].IsComplete() == true);
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[0] } };
Graph->RemoveVertex(VertexHandles[0]);
CHECK(Graph->GetVertices().Contains(VertexHandles[0]) == false);
CHECK(VertexHandles[0].IsComplete() == false);
CHECK(Graph->NumVertices() == 9);
CHECK(Graph->NumIslands() == 1);
}
SECTION("Split Island")
{
CHECK(Graph->GetVertices().Contains(VertexHandles[5]) == true);
CHECK(VertexHandles[5].IsComplete() == true);
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[5] } };
Graph->RemoveVertex(VertexHandles[5]);
CHECK(Graph->GetVertices().Contains(VertexHandles[5]) == false);
CHECK(VertexHandles[5].IsComplete() == false);
CHECK(Graph->NumVertices() == 9);
CHECK(Graph->NumIslands() == 2);
}
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Remove Vertex::Bulk::Fully Connected", "[graph]")
{
PopulateVertices(5, true);
BuildFullyConnectedEdges(5);
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[0], VertexHandles[1] } };
Graph->RemoveBulkVertices( { VertexHandles[0], VertexHandles[1] });
}
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[0]).IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[1]).IsComplete() == false);
CHECK(VertexHandles[0].IsComplete() == false);
CHECK(VertexHandles[1].IsComplete() == false);
CHECK(Graph->NumVertices() == 3);
CHECK(Graph->NumIslands() == 1);
{
FScopedVertexEdgeCleanupChecker Checker { Graph, TArray{ VertexHandles[2], VertexHandles[3], VertexHandles[4] } };
Graph->RemoveBulkVertices( { VertexHandles[2], VertexHandles[3], VertexHandles[4] });
}
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[2]).IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[3]).IsComplete() == false);
CHECK(Graph->GetCompleteNodeHandle(VertexHandles[4]).IsComplete() == false);
CHECK(VertexHandles[2].IsComplete() == false);
CHECK(VertexHandles[3].IsComplete() == false);
CHECK(VertexHandles[4].IsComplete() == false);
CHECK(Graph->NumVertices() == 0);
CHECK(Graph->NumIslands() == 0);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Remove Vertex::Bulk::Linear", "[graph]")
{
PopulateVertices(10, true);
BuildLinearEdges(10);
CHECK(Graph->NumVertices() == 10);
CHECK(Graph->NumIslands() == 1);
TArray<FGraphVertexHandle> VerticesToRemove = { VertexHandles[1], VertexHandles[2], VertexHandles[8] };
for (const FGraphVertexHandle& VertexHandle : VerticesToRemove)
{
CHECK(Graph->GetVertices().Contains(VertexHandle) == true);
CHECK(VertexHandle.IsComplete() == true);
}
FScopedVertexEdgeCleanupChecker Checker { Graph, VerticesToRemove };
Graph->RemoveBulkVertices(VerticesToRemove);
for (const FGraphVertexHandle& VertexHandle : VerticesToRemove)
{
CHECK(Graph->GetVertices().Contains(VertexHandle) == false);
CHECK(VertexHandle.IsComplete() == false);
}
CHECK(Graph->NumVertices() == 7);
CHECK(Graph->NumIslands() == 3);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Remove Vertex::Incomplete Handle", "[graph]")
{
PopulateVertices(5, true);
BuildLinearEdges(5);
FGraphVertexHandle RemoveHandle{ VertexHandles[0].GetUniqueIndex(), nullptr };
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 1);
UGraphIsland* Island = IslandHandles[0].GetIsland();
REQUIRE(Island != nullptr);
CHECK(Island->Num() == 5);
Graph->RemoveVertex(RemoveHandle);
CHECK(Graph->NumVertices() == 4);
CHECK(Graph->NumIslands() == 1);
CHECK(Island->Num() == 4);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Remove Island", "[graph]")
{
PopulateVertices(10, true);
BuildFullyConnectedEdges(5);
CHECK(Graph->NumVertices() == 10);
CHECK(Graph->NumIslands() == 2);
{
CHECK(Graph->GetIslands().Contains(IslandHandles[0]) == true);
CHECK(IslandHandles[0].IsComplete() == true);
TSet<FGraphVertexHandle> IslandVertices = IslandHandles[0].GetIsland()->GetVertices();
FScopedVertexEdgeCleanupChecker EdgeChecker { Graph, IslandVertices };
FScopedVertexIslandCleanupChecker IslandChecker { Graph, IslandVertices };
for (const FGraphVertexHandle& VertexHandle : IslandVertices)
{
CHECK(Graph->GetCompleteNodeHandle(VertexHandle).IsComplete() == true);
CHECK(Graph->GetVertices().Contains(VertexHandle) == true);
}
Graph->RemoveIsland(IslandHandles[0]);
for (const FGraphVertexHandle& VertexHandle : IslandVertices)
{
CHECK(Graph->GetCompleteNodeHandle(VertexHandle).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandle) == false);
}
CHECK(Graph->GetIslands().Contains(IslandHandles[0]) == false);
CHECK(IslandHandles[0].IsComplete() == false);
}
CHECK(Graph->NumVertices() == 5);
CHECK(Graph->NumIslands() == 1);
{
CHECK(Graph->GetIslands().Contains(IslandHandles[1]) == true);
CHECK(IslandHandles[1].IsComplete() == true);
TSet<FGraphVertexHandle> IslandVertices = IslandHandles[1].GetIsland()->GetVertices();
FScopedVertexEdgeCleanupChecker Checker { Graph, IslandVertices };
FScopedVertexIslandCleanupChecker IslandChecker { Graph, IslandVertices };
for (const FGraphVertexHandle& VertexHandle : IslandVertices)
{
CHECK(Graph->GetCompleteNodeHandle(VertexHandle).IsComplete() == true);
CHECK(Graph->GetVertices().Contains(VertexHandle) == true);
}
Graph->RemoveIsland(IslandHandles[1]);
for (const FGraphVertexHandle& VertexHandle : IslandVertices)
{
CHECK(Graph->GetCompleteNodeHandle(VertexHandle).IsComplete() == false);
CHECK(Graph->GetVertices().Contains(VertexHandle) == false);
}
CHECK(Graph->GetIslands().Contains(IslandHandles[1]) == false);
CHECK(IslandHandles[1].IsComplete() == false);
}
CHECK(Graph->NumVertices() == 0);
CHECK(Graph->NumIslands() == 0);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Event::Vertex Created", "[graph]")
{
FGraphUniqueIndex Node1Index = { FGuid { 1, 1, 1, 1 } };
FGraphVertexHandle CreatedHandle;
Graph->OnVertexCreated.AddLambda(
[&CreatedHandle, &Node1Index](const FGraphVertexHandle& InCreatedHandle)
{
CHECK(InCreatedHandle.IsComplete());
CHECK(InCreatedHandle.GetUniqueIndex() == Node1Index);
CreatedHandle = InCreatedHandle;
}
);
FGraphVertexHandle Node1 = Graph->CreateVertex(Node1Index);
CHECK(CreatedHandle == Node1);
CHECK(CreatedHandle.IsComplete() == true);
}
TEST_CASE_METHOD(FTestGraphBuilder, "Graph::Event::Island Created", "[graph]")
{
PopulateVertices(10, false);
FEdgeSpecifier Params{ VertexHandles[1], VertexHandles[0] };
FGraphIslandHandle CreatedHandle;
Graph->OnIslandCreated.AddLambda(
[&CreatedHandle](const FGraphIslandHandle& InCreatedHandle)
{
CHECK(InCreatedHandle.IsComplete());
CreatedHandle = InCreatedHandle;
}
);
Graph->CreateBulkEdges({ Params });
CHECK(CreatedHandle.IsComplete());
UGraphVertex* Vertex1 = VertexHandles[1].GetVertex();
REQUIRE(Vertex1 != nullptr);
CHECK(Vertex1->GetParentIsland() == CreatedHandle);
UGraphVertex* Vertex0 = VertexHandles[0].GetVertex();
REQUIRE(Vertex0 != nullptr);
CHECK(Vertex0->GetParentIsland() == CreatedHandle);
}