Files
UnrealEngine/Engine/Source/Developer/AITestSuite/Private/Tests/ResourceIdTest.cpp
2025-05-18 13:04:45 +08:00

132 lines
5.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "CoreMinimal.h"
#include "AITypes.h"
#include "AITestsCommon.h"
//----------------------------------------------------------------------//
// FAITest_ResourceIDBasic
//----------------------------------------------------------------------//
struct FAITest_ResourceIDBasic : public FAITestBase
{
virtual bool InstantTest() override
{
AITEST_TRUE("There are always some resources as long as AIModule is present", FAIResources::GetResourcesCount() > 0);
const FAIResourceID& MovementID = FAIResources::GetResource(FAIResources::Movement);
AITEST_TRUE("Resource ID's indexes are broken!", FAIResources::Movement == MovementID);
return true;
}
};
IMPLEMENT_AI_INSTANT_TEST(FAITest_ResourceIDBasic, "System.AI.Resource ID.Basic operations")
//----------------------------------------------------------------------//
// FAITest_ResourceLock
//----------------------------------------------------------------------//
struct FAITest_ResourceLock : public FAITestBase
{
virtual bool InstantTest() override
{
FAIResourceLock MockLock;
// basic locking
MockLock.SetLock(EAIRequestPriority::HardScript);
AITEST_TRUE("Resource should be locked", MockLock.IsLocked());
AITEST_TRUE("Resource should be locked with specified priority", MockLock.IsLockedBy(EAIRequestPriority::HardScript));
AITEST_FALSE("Resource should not be available for lower priorities", MockLock.IsAvailableFor(EAIRequestPriority::Logic));
AITEST_TRUE("Resource should be available for higher priorities", MockLock.IsAvailableFor(EAIRequestPriority::Reaction));
// clearing lock:
// try clearing with lower priority
MockLock.ClearLock(EAIRequestPriority::Logic);
AITEST_TRUE("Resource should be still locked", MockLock.IsLocked());
AITEST_FALSE("Resource should still not be available for lower priorities", MockLock.IsAvailableFor(EAIRequestPriority::Logic));
AITEST_TRUE("Resource should still be available for higher priorities", MockLock.IsAvailableFor(EAIRequestPriority::Reaction));
// releasing the actual lock
MockLock.ClearLock(EAIRequestPriority::HardScript);
AITEST_FALSE("Resource should be available now", MockLock.IsLocked());
// clearing all locks at one go
MockLock.SetLock(EAIRequestPriority::HardScript);
MockLock.SetLock(EAIRequestPriority::Logic);
MockLock.SetLock(EAIRequestPriority::Reaction);
bool bWasLocked = MockLock.IsLocked();
MockLock.ForceClearAllLocks();
AITEST_TRUE("Resource should no longer be locked", bWasLocked == true && MockLock.IsLocked() == false);
// merging
FAIResourceLock MockLock2;
MockLock.SetLock(EAIRequestPriority::HardScript);
MockLock2.SetLock(EAIRequestPriority::Logic);
// merge
MockLock2 += MockLock;
AITEST_TRUE("Resource should be locked on both priorities", MockLock2.IsLockedBy(EAIRequestPriority::Logic) && MockLock2.IsLockedBy(EAIRequestPriority::HardScript));
MockLock2.ClearLock(EAIRequestPriority::Logic);
AITEST_TRUE("At this point both locks should be identical", MockLock == MockLock2);
return true;
}
};
IMPLEMENT_AI_INSTANT_TEST(FAITest_ResourceLock, "System.AI.Resource ID.Resource locking")
//----------------------------------------------------------------------//
// FAITest_ResourceSet
//----------------------------------------------------------------------//
struct FAITest_ResourceSet : public FAITestBase
{
virtual bool InstantTest() override
{
{
FAIResourcesSet ResourceSet;
AITEST_TRUE("Resource Set should be empty by default", ResourceSet.IsEmpty());
for (uint8 FlagIndex = 0; FlagIndex < FAIResourcesSet::MaxFlags; ++FlagIndex)
{
AITEST_FALSE("Resource Set should not contain any resources when empty", ResourceSet.ContainsResourceIndex(FlagIndex));
}
}
{
FAIResourcesSet ResourceSet(FAIResourcesSet::AllResources);
AITEST_FALSE("Resource Set should be empty by default", ResourceSet.IsEmpty());
for (uint8 FlagIndex = 0; FlagIndex < FAIResourcesSet::MaxFlags; ++FlagIndex)
{
AITEST_TRUE("Full Resource Set should contain every resource", ResourceSet.ContainsResourceIndex(FlagIndex) == true);
}
}
{
const FAIResourceID& MovementResource = FAIResources::GetResource(FAIResources::Movement);
const FAIResourceID& PerceptionResource = FAIResources::GetResource(FAIResources::Perception);
FAIResourcesSet ResourceSet;
ResourceSet.AddResource(PerceptionResource);
AITEST_TRUE("Resource Set should contain added resource", ResourceSet.ContainsResource(PerceptionResource));
AITEST_TRUE("Resource Set should contain added resource given by Index", ResourceSet.ContainsResourceIndex(PerceptionResource.Index));
for (uint8 FlagIndex = 0; FlagIndex < FAIResourcesSet::MaxFlags; ++FlagIndex)
{
if (FlagIndex != PerceptionResource.Index)
{
AITEST_FALSE("Resource Set should not contain any other resources", ResourceSet.ContainsResourceIndex(FlagIndex));
}
}
AITEST_FALSE("Resource Set should not be empty after adding a resource", ResourceSet.IsEmpty());
ResourceSet.AddResourceIndex(MovementResource.Index);
AITEST_TRUE("Resource Set should contain second added resource", ResourceSet.ContainsResource(MovementResource));
AITEST_TRUE("Resource Set should contain second added resource given by Index", ResourceSet.ContainsResourceIndex(MovementResource.Index));
ResourceSet.RemoveResource(MovementResource);
AITEST_FALSE("Resource Set should no longer contain second added resource", ResourceSet.ContainsResource(MovementResource));
AITEST_FALSE("Resource Set should still be not empty after removing one resource", ResourceSet.IsEmpty());
ResourceSet.RemoveResourceIndex(PerceptionResource.Index);
AITEST_TRUE("Resource Set should be empty after removing last resource", ResourceSet.IsEmpty() == true);
}
return true;
}
};
IMPLEMENT_AI_INSTANT_TEST(FAITest_ResourceSet, "System.AI.Resource ID.Resource locking")