refactor(runtime): extract the live object frame
This commit is contained in:
parent
99a3e819c4
commit
4e4aac2c5a
27 changed files with 1217 additions and 371 deletions
|
|
@ -47,6 +47,10 @@ public sealed class GameWindowLiveEntityCompositionTests
|
|||
[InlineData("DispatchRemoteInboundMotion")]
|
||||
[InlineData("CreateRemoteMotion")]
|
||||
[InlineData("WillAdvanceRemoteMotion")]
|
||||
[InlineData("AdvanceLiveObjectRuntime")]
|
||||
[InlineData("AdvanceLiveObjectRuntimeCore")]
|
||||
[InlineData("ReconcileLiveObjectSpatialPresentation")]
|
||||
[InlineData("CaptureAnimationHooks")]
|
||||
public void GameWindow_DoesNotReacquireExtractedLiveEntityBodies(string methodName)
|
||||
{
|
||||
Assert.Null(typeof(GameWindow).GetMethod(methodName, PrivateImplementation));
|
||||
|
|
@ -73,6 +77,13 @@ public sealed class GameWindowLiveEntityCompositionTests
|
|||
[InlineData(typeof(LiveEntityMotionRuntimeController))]
|
||||
[InlineData(typeof(LiveEntityInboundAuthorityGate))]
|
||||
[InlineData(typeof(DeferredLiveEntityMotionRuntimeBindings))]
|
||||
[InlineData(typeof(AcDream.App.Update.LiveObjectFrameController))]
|
||||
[InlineData(typeof(AcDream.App.Update.LiveEffectFrameController))]
|
||||
[InlineData(typeof(AcDream.App.Update.LiveSpatialPresentationReconciler))]
|
||||
[InlineData(typeof(LiveEntityAnimationPresenter))]
|
||||
[InlineData(typeof(LiveAnimationPresentationContext))]
|
||||
[InlineData(typeof(StaticLiveRootCommitter))]
|
||||
[InlineData(typeof(RetailLiveFrameCoordinator))]
|
||||
public void ExtractedHelpers_DoNotOwnGuidIndexesOrBackendState(Type helperType)
|
||||
{
|
||||
foreach (FieldInfo field in helperType.GetFields(
|
||||
|
|
@ -83,6 +94,89 @@ public sealed class GameWindowLiveEntityCompositionTests
|
|||
string typeName = field.FieldType.FullName ?? field.FieldType.Name;
|
||||
Assert.DoesNotContain("Silk.NET", typeName, StringComparison.Ordinal);
|
||||
Assert.DoesNotContain("OpenGL", typeName, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.NotEqual(typeof(GameWindow), field.FieldType);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ExtractedUpdateOwners_DoNotRetainAnonymousCallbacks()
|
||||
{
|
||||
Type[] owners =
|
||||
[
|
||||
typeof(AcDream.App.Update.LiveObjectFrameController),
|
||||
typeof(AcDream.App.Update.LiveEffectFrameController),
|
||||
typeof(AcDream.App.Update.LiveSpatialPresentationReconciler),
|
||||
typeof(LiveEntityAnimationScheduler),
|
||||
typeof(LiveEntityAnimationPresenter),
|
||||
typeof(LiveAnimationPresentationContext),
|
||||
typeof(StaticLiveRootCommitter),
|
||||
typeof(RetailLiveFrameCoordinator),
|
||||
];
|
||||
|
||||
foreach (Type owner in owners)
|
||||
{
|
||||
Assert.DoesNotContain(
|
||||
owner.GetFields(BindingFlags.Instance | BindingFlags.NonPublic),
|
||||
field => typeof(Delegate).IsAssignableFrom(field.FieldType));
|
||||
}
|
||||
|
||||
Assert.False(typeof(ILiveAnimationPresentationContext).IsAssignableFrom(
|
||||
typeof(GameWindow)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RuntimeViewsAndProjectileController_RetainTypedSourcesNotWindowClosures()
|
||||
{
|
||||
FieldInfo animationRuntime = Assert.Single(
|
||||
typeof(LiveEntityAnimationRuntimeView<LiveEntityAnimationState>)
|
||||
.GetFields(BindingFlags.Instance | BindingFlags.NonPublic),
|
||||
field => field.Name == "_runtime");
|
||||
FieldInfo remoteRuntime = Assert.Single(
|
||||
typeof(LiveEntityRemoteMotionRuntimeView<RemoteMotion>)
|
||||
.GetFields(BindingFlags.Instance | BindingFlags.NonPublic),
|
||||
field => field.Name == "_runtime");
|
||||
Assert.Equal(typeof(ILiveEntityRuntimeSource), animationRuntime.FieldType);
|
||||
Assert.Equal(typeof(ILiveEntityRuntimeSource), remoteRuntime.FieldType);
|
||||
|
||||
FieldInfo[] projectileFields = typeof(ProjectileController).GetFields(
|
||||
BindingFlags.Instance | BindingFlags.NonPublic);
|
||||
Assert.Equal(
|
||||
typeof(IProjectileSetupResolver),
|
||||
Assert.Single(projectileFields, field => field.Name == "_setupResolver").FieldType);
|
||||
Assert.Equal(
|
||||
typeof(IEntityRootPosePublisher),
|
||||
Assert.Single(projectileFields, field => field.Name == "_rootPoses").FieldType);
|
||||
Assert.Equal(
|
||||
typeof(LiveWorldOriginState),
|
||||
Assert.Single(projectileFields, field => field.Name == "_origin").FieldType);
|
||||
Assert.DoesNotContain(
|
||||
projectileFields,
|
||||
field => typeof(Delegate).IsAssignableFrom(field.FieldType)
|
||||
&& !field.Name.Contains("DiagnosticSink", StringComparison.Ordinal));
|
||||
|
||||
string source = File.ReadAllText(Path.Combine(
|
||||
FindRepoRoot(), "src", "AcDream.App", "Rendering", "GameWindow.cs"));
|
||||
Assert.DoesNotContain(
|
||||
"new LiveEntityAnimationRuntimeView<LiveEntityAnimationState>(() =>",
|
||||
source,
|
||||
StringComparison.Ordinal);
|
||||
Assert.DoesNotContain(
|
||||
"new LiveEntityRemoteMotionRuntimeView<RemoteMotion>(() =>",
|
||||
source,
|
||||
StringComparison.Ordinal);
|
||||
Assert.Contains("new AcDream.App.Physics.DatProjectileSetupResolver", source);
|
||||
}
|
||||
|
||||
private static string FindRepoRoot()
|
||||
{
|
||||
DirectoryInfo? directory = new(AppContext.BaseDirectory);
|
||||
while (directory is not null)
|
||||
{
|
||||
if (File.Exists(Path.Combine(directory.FullName, "AcDream.slnx")))
|
||||
return directory.FullName;
|
||||
directory = directory.Parent;
|
||||
}
|
||||
|
||||
throw new DirectoryNotFoundException("Could not find AcDream.slnx.");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue