test: replace streaming source freezes

This commit is contained in:
Erik 2026-08-18 15:14:41 +02:00
parent 5a33369074
commit 0ad2ee1cdf
6 changed files with 436 additions and 285 deletions

View file

@ -1,7 +1,11 @@
using System.Collections;
using System.Reflection;
using AcDream.App.Composition;
using AcDream.App.Input;
using AcDream.App.Net;
using AcDream.App.Physics;
using AcDream.App.Rendering;
using AcDream.App.Tests.Architecture;
using AcDream.App.World;
using AcDream.Core.Net;
using AcDream.Core.Physics;
@ -213,58 +217,74 @@ public sealed class GameWindowLiveEntityCompositionTests
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"));
string livePresentation = File.ReadAllText(Path.Combine(
FindRepoRoot(),
"src",
"AcDream.App",
"Composition",
"LivePresentationComposition.cs"));
FieldInfo[] windowFields = typeof(GameWindow).GetFields(
BindingFlags.Instance | BindingFlags.NonPublic);
Assert.Equal(
typeof(LiveEntityAnimationRuntimeView<LiveEntityAnimationState>),
Assert.Single(windowFields, field => field.Name == "_animatedEntities").FieldType);
Assert.DoesNotContain(
"new LiveEntityAnimationRuntimeView<LiveEntityAnimationState>(() =>",
source,
StringComparison.Ordinal);
Assert.DoesNotContain(
"LiveEntityRemoteMotionRuntimeView",
source,
StringComparison.Ordinal);
Assert.Contains("new DatProjectileSetupResolver", livePresentation);
windowFields,
field => field.FieldType.Name.Contains(
"LiveEntityRemoteMotionRuntimeView",
StringComparison.Ordinal));
MethodInfo compose = typeof(LivePresentationCompositionPhase).GetMethod(
"ComposeCore",
BindingFlags.Instance | BindingFlags.NonPublic)!;
IReadOnlyList<CompiledCall> calls = CompiledCallGraph.Read(compose);
int resolver = RequiredCallIndex(
calls,
typeof(DatProjectileSetupResolver),
".ctor");
int controller = RequiredCallIndex(
calls,
typeof(ProjectileController),
".ctor");
Assert.True(resolver < controller);
}
[Fact]
public void SessionReset_ClosesEveryStreamingReadinessOwner()
public void SessionReset_CallsPlayerModeNetworkAndWorldOriginOwners()
{
string source = File.ReadAllText(Path.Combine(
FindRepoRoot(), "src", "AcDream.App", "Net", "LiveSessionRuntimeFactory.cs"));
MethodInfo resetPlayer = typeof(LiveSessionRuntimeFactory).GetMethod(
"ResetPlayerPresentation",
BindingFlags.Instance | BindingFlags.NonPublic)!;
IReadOnlyList<CompiledCall> playerCalls = CompiledCallGraph.Read(resetPlayer);
Assert.True(RequiredCallIndex(
playerCalls,
typeof(PlayerModeController),
nameof(PlayerModeController.ResetSession)) >= 0);
Assert.Contains("_interaction.PlayerMode.ResetSession();", source,
StringComparison.Ordinal);
string playerModeSource = File.ReadAllText(Path.Combine(
FindRepoRoot(),
"src",
"AcDream.App",
"Input",
"PlayerModeController.cs"));
Assert.Contains("_mode.ResetSession();", playerModeSource,
StringComparison.Ordinal);
Assert.Contains(
"_world.NetworkUpdates.ResetSessionState();",
source,
StringComparison.Ordinal);
Assert.Contains("_player.WorldOrigin.Reset();", source, StringComparison.Ordinal);
MethodInfo resetMode = typeof(PlayerModeController).GetMethod(
nameof(PlayerModeController.ResetSession))!;
IReadOnlyList<CompiledCall> modeCalls = CompiledCallGraph.Read(resetMode);
Assert.True(RequiredCallIndex(
modeCalls,
typeof(LocalPlayerModeState),
nameof(LocalPlayerModeState.ResetSession)) >= 0);
MethodInfo resetIdentity = typeof(LiveSessionRuntimeFactory).GetMethod(
"ResetIdentityPresentation",
BindingFlags.Instance | BindingFlags.NonPublic)!;
IReadOnlyList<CompiledCall> identityCalls = CompiledCallGraph.Read(resetIdentity);
int network = RequiredCallIndex(
identityCalls,
typeof(LiveEntityNetworkUpdateController),
nameof(LiveEntityNetworkUpdateController.ResetSessionState));
int origin = RequiredCallIndex(
identityCalls,
typeof(LiveWorldOriginState),
nameof(LiveWorldOriginState.Reset));
Assert.True(network < origin);
}
private static string FindRepoRoot()
private static int RequiredCallIndex(
IReadOnlyList<CompiledCall> calls,
Type declaringType,
string methodName)
{
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.");
int index = CompiledCallGraph.IndexOf(calls, declaringType, methodName);
Assert.True(index >= 0, $"Missing compiled call: {declaringType.Name}.{methodName}");
return index;
}
}