Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Private/Tests/ChunkDependencyTests.cpp
2025-05-18 13:04:45 +08:00

130 lines
7.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Misc/AutomationTest.h"
#if WITH_AUTOMATION_TESTS
#include "Commandlets/ChunkDependencyInfo.h"
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FChunkDependencyHighestSharedTest, "System.Core.ChunkDependency.HighestSharedChunk",
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FChunkDependencyHighestSharedTest::RunTest(const FString& Parameters)
{
UChunkDependencyInfo* ChunkDependencyInfo = NewObject<UChunkDependencyInfo>();
ChunkDependencyInfo->DependencyArray.Empty();
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(5, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(10, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(20, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(30, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(40, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(50, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(60, 40));
ChunkDependencyInfo->BuildChunkDependencyGraph(60);
// 0
// / | \
// 5 10 20
// / | \
// 30 40 50
// |
// 60
UTEST_EQUAL(TEXT("Invalid"), ChunkDependencyInfo->FindHighestSharedChunk({INDEX_NONE}), INDEX_NONE);
UTEST_EQUAL(TEXT("Non existent"), ChunkDependencyInfo->FindHighestSharedChunk({100}), INDEX_NONE);
UTEST_EQUAL(TEXT("Partial Invalid"), ChunkDependencyInfo->FindHighestSharedChunk({0, INDEX_NONE}), INDEX_NONE);
UTEST_EQUAL(TEXT("Empty"), ChunkDependencyInfo->FindHighestSharedChunk({}), INDEX_NONE);
UTEST_EQUAL(TEXT("Single"), ChunkDependencyInfo->FindHighestSharedChunk({ 10 }), 10);
UTEST_EQUAL(TEXT("Duplicate"), ChunkDependencyInfo->FindHighestSharedChunk({ 10, 10 }), 10);
UTEST_EQUAL(TEXT("Two leaf nodes are able to find a parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 5, 10 }), 0);
UTEST_EQUAL(TEXT("Non leaf nodes are able to find a parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 10, 20 }), 0);
UTEST_EQUAL(TEXT("Parent and Leaf results in parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 30 }), 20);
UTEST_EQUAL(TEXT("separatend leaves find parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 60 }), 20);
UTEST_EQUAL(TEXT("Complex parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(20, 40, 60) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(20, 40, 30) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 40, 30 }), 20);
UTEST_EQUAL(TEXT("(40, 60) = 40"), ChunkDependencyInfo->FindHighestSharedChunk({ 40, 60 }), 40);
UTEST_EQUAL(TEXT("(5, 60) = 0"), ChunkDependencyInfo->FindHighestSharedChunk({ 5, 60 }), 0);
UTEST_EQUAL(TEXT("(0, 5) = 0"), ChunkDependencyInfo->FindHighestSharedChunk({ 0, 5 }), 0);
return true;
}
/**
* multiple parents are not supported by the chunk dependencies.
* Only the first parent will be considered the parent.
*/
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FChunkDependencyMultipleParentTest, "System.Core.ChunkDependency.MultipleParent",
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FChunkDependencyMultipleParentTest::RunTest(const FString& Parameters)
{
UChunkDependencyInfo* ChunkDependencyInfo = NewObject<UChunkDependencyInfo>();
ChunkDependencyInfo->DependencyArray.Empty();
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(5, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(10, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(20, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(30, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(40, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(50, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(60, 40));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(60, 30));
ChunkDependencyInfo->BuildChunkDependencyGraph(60);
// 0
// / | \
// 5 10 20
// / | \
// 30 40 50
// \ |
// 60
UTEST_EQUAL(TEXT("Single"), ChunkDependencyInfo->FindHighestSharedChunk({ 10 }), 10);
UTEST_EQUAL(TEXT("Duplicate"), ChunkDependencyInfo->FindHighestSharedChunk({ 10, 10 }), 10);
UTEST_EQUAL(TEXT("Two leaf nodes are able to find a parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 5, 10 }), 0);
UTEST_EQUAL(TEXT("Non leaf nodes are able to find a parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 10, 20 }), 0);
UTEST_EQUAL(TEXT("Parent and Leaf results in parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 30 }), 20);
UTEST_EQUAL(TEXT("separatend leaves find parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 60 }), 20);
UTEST_EQUAL(TEXT("Complex parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(20, 40, 60) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(20, 40, 30) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 40, 30 }), 20);
UTEST_EQUAL(TEXT("(40, 60) = 40"), ChunkDependencyInfo->FindHighestSharedChunk({ 40, 60 }), 40);
UTEST_EQUAL(TEXT("(30, 40, 60) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(30, 60) = 20 - multiple parents not supported."), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 60 }), 20);
UTEST_EQUAL(TEXT("(10, 60) = 0"), ChunkDependencyInfo->FindHighestSharedChunk({ 10, 60 }), 0);
return true;
}
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FChunkDependencyCycleTest, "System.Core.ChunkDependency.Cycle",
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FChunkDependencyCycleTest::RunTest(const FString& Parameters)
{
UChunkDependencyInfo* ChunkDependencyInfo = NewObject<UChunkDependencyInfo>();
ChunkDependencyInfo->DependencyArray.Empty();
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(5, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(10, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(20, 0));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(30, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(40, 20));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(60, 40));
ChunkDependencyInfo->DependencyArray.Add(FChunkDependency(60, 20));
ChunkDependencyInfo->BuildChunkDependencyGraph(60);
// 0
// / | \
// 5 10 20
// / |
// 30 40
// |
// 60
// |
// 20
UTEST_EQUAL(TEXT("Two leaf nodes are able to find a parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 5, 10 }), 0);
UTEST_EQUAL(TEXT("separatend leaves find parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 60 }), 20);
UTEST_EQUAL(TEXT("Complex parent"), ChunkDependencyInfo->FindHighestSharedChunk({ 30, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(20, 40, 60) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 40, 60 }), 20);
UTEST_EQUAL(TEXT("(20, 60) = 20"), ChunkDependencyInfo->FindHighestSharedChunk({ 20, 60 }), 20);
UTEST_EQUAL(TEXT("(40, 60) = 40"), ChunkDependencyInfo->FindHighestSharedChunk({ 40, 60 }), 40);
return true;
}
#endif // WITH_AUTOMATION_TESTS