test: replace streaming source freezes
This commit is contained in:
parent
5a33369074
commit
0ad2ee1cdf
6 changed files with 436 additions and 285 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue