2022-04-27 09:07:12 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "AITestsCommon.h"
2023-01-11 03:01:44 -05:00
# include "Engine/Engine.h"
2022-04-27 09:07:12 -04:00
# include "MassProcessorDependencySolver.h"
# include "MassEntityTestTypes.h"
2023-01-11 03:01:44 -05:00
# include "MassSubsystemAccess.h"
# include "MassExecutionContext.h"
2022-04-27 09:07:12 -04:00
# define LOCTEXT_NAMESPACE "MassTest"
2023-01-11 03:01:44 -05:00
UE_DISABLE_OPTIMIZATION_SHIP
//////////////////////////////////////////////////////////////////////////
// Tests
2022-04-27 09:07:12 -04:00
namespace FMassSystemRequirementTest
{
2022-08-12 07:56:27 -04:00
struct FSystemRequirementTestBase : FEntityTestBase
2022-04-27 09:07:12 -04:00
{
using Super = FEntityTestBase ;
2023-01-11 03:01:44 -05:00
FMassEntityQuery EntityQuery ;
FSystemRequirementTestBase ( )
{
bMakeWorldEntityManagersOwner = true ;
}
2022-12-05 02:33:03 -05:00
2022-04-27 09:07:12 -04:00
virtual bool SetUp ( ) override
2023-03-29 11:01:39 -04:00
{
2023-01-11 03:01:44 -05:00
if ( Super : : SetUp ( ) )
{
EntityManager - > CreateEntity ( FloatsArchetype ) ;
EntityQuery . AddRequirement < FTestFragment_Float > ( EMassFragmentAccess : : ReadOnly ) ;
return true ;
}
return false ;
2022-04-27 09:07:12 -04:00
}
} ;
2023-01-11 03:01:44 -05:00
//////////////////////////////////////////////////////////////////////////
// The main point of this specific test is to verify that we're getting the same answers from both
// FMassEntityQuery and FMassSubsystemAccess.
2023-03-29 11:01:39 -04:00
struct FGenericSubsystemAccessAPI : FSystemRequirementTestBase
2022-04-27 09:07:12 -04:00
{
virtual bool InstantTest ( ) override
{
2023-01-11 03:01:44 -05:00
UWorld * World = FAITestHelpers : : GetWorld ( ) ;
check ( World ) ;
FMassSubsystemAccess SubsystemAccessBits ( World ) ;
FMassSubsystemAccess SubsystemAccessClasses ( World ) ;
2022-04-27 09:07:12 -04:00
2022-04-29 11:01:35 -04:00
EntityQuery . AddSubsystemRequirement < UMassTestWorldSubsystem > ( EMassFragmentAccess : : ReadWrite ) ;
2023-01-11 03:01:44 -05:00
EntityQuery . AddSubsystemRequirement < UMassTestEngineSubsystem > ( EMassFragmentAccess : : ReadWrite ) ;
2022-04-27 09:07:12 -04:00
2023-01-11 03:01:44 -05:00
SubsystemAccessBits . SetSubsystemRequirementBits ( EntityQuery . GetRequiredConstSubsystems ( ) , EntityQuery . GetRequiredMutableSubsystems ( ) ) ;
SubsystemAccessClasses . SetSubsystemRequirements ( EntityQuery ) ;
2022-04-27 09:07:12 -04:00
2023-01-11 03:01:44 -05:00
UMassTestWorldSubsystem * TestWorldSubsystemActual = World - > GetSubsystem < UMassTestWorldSubsystem > ( ) ;
UMassTestEngineSubsystem * TestEngineSubsystemActual = GEngine - > GetEngineSubsystem < UMassTestEngineSubsystem > ( ) ;
UMassTestWorldSubsystem * AccessWorldSubsystem = nullptr ;
UMassTestEngineSubsystem * AccessEngineSubsystem = nullptr ;
const UMassTestWorldSubsystem * ConstAccessWorldSubsystem = nullptr ;
const UMassTestEngineSubsystem * ConstAccessEngineSubsystem = nullptr ;
FMassExecutionContext ExecutionContext ( * EntityManager ) ;
EntityQuery . ForEachEntityChunk ( * EntityManager , ExecutionContext , [ & ] ( FMassExecutionContext & Context )
{
AccessWorldSubsystem = Context . GetMutableSubsystem < UMassTestWorldSubsystem > ( ) ;
AccessEngineSubsystem = Context . GetMutableSubsystem < UMassTestEngineSubsystem > ( ) ;
ConstAccessWorldSubsystem = Context . GetSubsystem < UMassTestWorldSubsystem > ( ) ;
ConstAccessEngineSubsystem = Context . GetSubsystem < UMassTestEngineSubsystem > ( ) ;
2023-03-29 11:01:39 -04:00
} ) ;
AITEST_NOT_NULL ( TEXT ( " WorldSubsystem: Subsystem Actual is expected to be not NULL " ) , TestWorldSubsystemActual ) ;
AITEST_EQUAL ( TEXT ( " WorldSubsystem: Mutable Subsystem fetched is expected to be the same as the Actual " ) , TestWorldSubsystemActual , AccessWorldSubsystem ) ;
AITEST_EQUAL ( TEXT ( " WorldSubsystem: Const Subsystem fetched is expected to be the same as the Actual " ) , TestWorldSubsystemActual , ConstAccessWorldSubsystem ) ;
AITEST_EQUAL ( TEXT ( " WorldSubsystem: Subsystem fetched via bits-requirements is expected to be the same as the Actual " )
, TestWorldSubsystemActual , SubsystemAccessBits . GetSubsystem < UMassTestWorldSubsystem > ( ) ) ;
AITEST_EQUAL ( TEXT ( " WorldSubsystem: Subsystem fetched via class-requirements is expected to be the same as the Actual " )
, TestWorldSubsystemActual , SubsystemAccessClasses . GetSubsystem < UMassTestWorldSubsystem > ( ) ) ;
AITEST_NOT_NULL ( TEXT ( " EngineSubsystem: Subsystem Actual is expected to be not NULL " ) , TestEngineSubsystemActual ) ;
AITEST_EQUAL ( TEXT ( " EngineSubsystem: Mutable Subsystem fetched is expected to be the same as the Actual " ) , TestEngineSubsystemActual , AccessEngineSubsystem ) ;
AITEST_EQUAL ( TEXT ( " EngineSubsystem: Const Subsystem fetched is expected to be the same as the Actual " ) , TestEngineSubsystemActual , ConstAccessEngineSubsystem ) ;
AITEST_EQUAL ( TEXT ( " EngineSubsystem: Subsystem fetched via bits-requirements is expected to be the same as the Actual " )
, TestEngineSubsystemActual , SubsystemAccessBits . GetSubsystem < UMassTestEngineSubsystem > ( ) ) ;
AITEST_EQUAL ( TEXT ( " EngineSubsystem: Subsystem fetched via class-requirements is expected to be the same as the Actual " )
, TestEngineSubsystemActual , SubsystemAccessClasses . GetSubsystem < UMassTestEngineSubsystem > ( ) ) ;
return true ;
}
} ;
IMPLEMENT_AI_INSTANT_TEST ( FGenericSubsystemAccessAPI , " System.Mass.Query.System.AccessAPI.Generic " ) ;
struct FGameSubsystemAccessAPI : FSystemRequirementTestBase
{
virtual bool InstantTest ( ) override
{
UWorld * World = FAITestHelpers : : GetWorld ( ) ;
check ( World ) ;
const ULocalPlayer * LocalPlayer = World - > GetFirstLocalPlayerFromController ( ) ;
UMassTestLocalPlayerSubsystem * TestLocalPlayerSubsystemActual = LocalPlayer ? LocalPlayer - > GetSubsystem < UMassTestLocalPlayerSubsystem > ( ) : nullptr ;
const UGameInstance * GameInstance = World - > GetGameInstance ( ) ;
UMassTestGameInstanceSubsystem * TestGameInstanceSubsystemActual = GameInstance ? GameInstance - > GetSubsystem < UMassTestGameInstanceSubsystem > ( ) : nullptr ;
if ( World - > IsGameWorld ( ) = = false )
{
// no point in running the full test since none of the used system classes should produce any instances
// just verify this assumption
AITEST_NULL ( TEXT ( " LocalPlayerSubsystem subclass instance is expected to be NULL in non-game worlds " ) , TestLocalPlayerSubsystemActual ) ;
AITEST_NULL ( TEXT ( " GameInstanceSubsystem subclass instance is expected to be NULL in non-game worlds " ) , TestGameInstanceSubsystemActual ) ;
return true ;
}
FMassSubsystemAccess SubsystemAccessBits ( World ) ;
FMassSubsystemAccess SubsystemAccessClasses ( World ) ;
EntityQuery . AddSubsystemRequirement < UMassTestLocalPlayerSubsystem > ( EMassFragmentAccess : : ReadWrite ) ;
EntityQuery . AddSubsystemRequirement < UMassTestGameInstanceSubsystem > ( EMassFragmentAccess : : ReadWrite ) ;
SubsystemAccessBits . SetSubsystemRequirementBits ( EntityQuery . GetRequiredConstSubsystems ( ) , EntityQuery . GetRequiredMutableSubsystems ( ) ) ;
SubsystemAccessClasses . SetSubsystemRequirements ( EntityQuery ) ;
UMassTestLocalPlayerSubsystem * AccessLocalPlayerSubsystem = nullptr ;
UMassTestGameInstanceSubsystem * AccessGameInstanceSubsystem = nullptr ;
const UMassTestLocalPlayerSubsystem * ConstAccessLocalPlayerSubsystem = nullptr ;
const UMassTestGameInstanceSubsystem * ConstAccessGameInstanceSubsystem = nullptr ;
FMassExecutionContext ExecutionContext ( * EntityManager ) ;
EntityQuery . ForEachEntityChunk ( * EntityManager , ExecutionContext , [ & ] ( FMassExecutionContext & Context )
{
AccessLocalPlayerSubsystem = Context . GetMutableSubsystem < UMassTestLocalPlayerSubsystem > ( ) ;
AccessGameInstanceSubsystem = Context . GetMutableSubsystem < UMassTestGameInstanceSubsystem > ( ) ;
2023-01-11 03:01:44 -05:00
ConstAccessLocalPlayerSubsystem = Context . GetSubsystem < UMassTestLocalPlayerSubsystem > ( ) ;
ConstAccessGameInstanceSubsystem = Context . GetSubsystem < UMassTestGameInstanceSubsystem > ( ) ;
} ) ;
2023-03-29 11:01:39 -04:00
AITEST_EQUAL ( TEXT ( " LocalPlayerSubsystem: Mutable Subsystem fetched is expected to be the same as the Actual " ) , TestLocalPlayerSubsystemActual , AccessLocalPlayerSubsystem ) ;
AITEST_EQUAL ( TEXT ( " LocalPlayerSubsystem: Const Subsystem fetched is expected to be the same as the Actual " ) , TestLocalPlayerSubsystemActual , ConstAccessLocalPlayerSubsystem ) ;
AITEST_EQUAL ( TEXT ( " LocalPlayerSubsystem: Subsystem fetched via bits-requirements is expected to be the same as the Actual " )
2023-01-11 03:01:44 -05:00
, TestLocalPlayerSubsystemActual , SubsystemAccessBits . GetSubsystem < UMassTestLocalPlayerSubsystem > ( ) ) ;
2023-03-29 11:01:39 -04:00
AITEST_EQUAL ( TEXT ( " LocalPlayerSubsystem: Subsystem fetched via class-requirements is expected to be the same as the Actual " )
2023-01-11 03:01:44 -05:00
, TestLocalPlayerSubsystemActual , SubsystemAccessClasses . GetSubsystem < UMassTestLocalPlayerSubsystem > ( ) ) ;
2023-03-29 11:01:39 -04:00
AITEST_EQUAL ( TEXT ( " GameInstanceSubsystem: Mutable Subsystem fetched is expected to be the same as the Actual " ) , TestGameInstanceSubsystemActual , AccessGameInstanceSubsystem ) ;
AITEST_EQUAL ( TEXT ( " GameInstanceSubsystem: Const Subsystem fetched is expected to be the same as the Actual " ) , TestGameInstanceSubsystemActual , ConstAccessGameInstanceSubsystem ) ;
AITEST_EQUAL ( TEXT ( " GameInstanceSubsystem: Subsystem fetched via bits-requirements is expected to be the same as the Actual " )
2023-01-11 03:01:44 -05:00
, TestGameInstanceSubsystemActual , SubsystemAccessBits . GetSubsystem < UMassTestGameInstanceSubsystem > ( ) ) ;
2023-03-29 11:01:39 -04:00
AITEST_EQUAL ( TEXT ( " GameInstanceSubsystem: Subsystem fetched via class-requirements is expected to be the same as the Actual " )
2023-01-11 03:01:44 -05:00
, TestGameInstanceSubsystemActual , SubsystemAccessClasses . GetSubsystem < UMassTestGameInstanceSubsystem > ( ) ) ;
2022-04-27 09:07:12 -04:00
return true ;
}
} ;
2023-03-29 11:01:39 -04:00
IMPLEMENT_AI_INSTANT_TEST ( FGameSubsystemAccessAPI , " System.Mass.Query.System.AccessAPI.Game " ) ;
2022-04-27 09:07:12 -04:00
} // FMassSystemRequirementTest
# undef LOCTEXT_NAMESPACE
2023-01-11 03:01:44 -05:00
UE_ENABLE_OPTIMIZATION_SHIP