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,9 @@
using System.Collections.Immutable;
using System.Numerics;
using System.Reflection;
using AcDream.App.Rendering;
using AcDream.App.Streaming;
using AcDream.App.Tests.Architecture;
using AcDream.Core.Net;
using AcDream.Core.Net.Messages;
using AcDream.Core.Physics;
@ -1047,34 +1049,63 @@ public sealed class LandblockPhysicsPublisherTests
[Fact]
public void GameWindow_HasNoLandblockPhysicsPublicationBodies()
{
string source = File.ReadAllText(Path.Combine(
FindRepoRoot(),
"src",
"AcDream.App",
"Rendering",
"GameWindow.cs"));
IReadOnlyList<CompiledCall> windowCalls =
CompiledCallGraph.ReadDeclared(typeof(GameWindow));
AssertNoCall(windowCalls, typeof(PhysicsDataCache), nameof(PhysicsDataCache.CacheCellStruct));
AssertNoCall(windowCalls, typeof(PhysicsDataCache), nameof(PhysicsDataCache.CacheBuilding));
AssertNoCall(
windowCalls,
typeof(ShadowShapeBuilder),
nameof(ShadowShapeBuilder.FromLandblockBspParts));
AssertNoCall(
windowCalls,
typeof(ShadowObjectRegistry),
nameof(ShadowObjectRegistry.RefloodLandblock));
AssertNoCall(
windowCalls,
typeof(PhysicsEngine),
"DemoteLandblockToTerrain");
AssertNoCall(windowCalls, typeof(PhysicsEngine), "RemoveLandblock");
Assert.DoesNotContain("_physicsDataCache.CacheCellStruct", source, StringComparison.Ordinal);
Assert.DoesNotContain("_physicsDataCache.CacheBuilding", source, StringComparison.Ordinal);
Assert.DoesNotContain("ShadowShapeBuilder.FromLandblockBspParts", source, StringComparison.Ordinal);
Assert.DoesNotContain("ShadowObjects.RefloodLandblock", source, StringComparison.Ordinal);
Assert.DoesNotContain("_physicsEngine.DemoteLandblockToTerrain", source, StringComparison.Ordinal);
Assert.DoesNotContain("_physicsEngine.RemoveLandblock", source, StringComparison.Ordinal);
string publisherSource = File.ReadAllText(Path.Combine(
FindRepoRoot(),
"src",
"AcDream.App",
"Streaming",
"LandblockPhysicsPublisher.cs"));
Assert.DoesNotContain("_physicsDataCache.RemoveCellsForLandblock", publisherSource, StringComparison.Ordinal);
Assert.DoesNotContain("_physicsDataCache.RemoveBuildingsForLandblock", publisherSource, StringComparison.Ordinal);
Assert.DoesNotContain("_physicsEngine.ShadowObjects.Reflood", publisherSource, StringComparison.Ordinal);
Assert.Contains("CommitCollisionGeneration(", publisherSource, StringComparison.Ordinal);
Assert.DoesNotContain(
"RestartCollisionRetainedOwnerCapture(",
publisherSource,
StringComparison.Ordinal);
IReadOnlyList<CompiledCall> publisherCalls =
CompiledCallGraph.ReadDeclared(typeof(LandblockPhysicsPublisher));
MethodInfo advance = typeof(LandblockPhysicsPublisher).GetMethod(
"AdvanceBeginOne",
BindingFlags.Instance | BindingFlags.NonPublic)!;
IReadOnlyList<CompiledCall> advanceCalls = CompiledCallGraph.Read(advance);
int stagedCache = CompiledCallGraph.IndexOf(
advanceCalls,
typeof(LandblockPhysicsPublication),
"get_StagingCache");
int removeCells = CompiledCallGraph.IndexOf(
advanceCalls,
typeof(PhysicsDataCache),
nameof(PhysicsDataCache.RemoveCellsForLandblock));
int removeBuildings = CompiledCallGraph.IndexOf(
advanceCalls,
typeof(PhysicsDataCache),
nameof(PhysicsDataCache.RemoveBuildingsForLandblock));
int secondStagedCache = CompiledCallGraph.IndexOf(
advanceCalls,
typeof(LandblockPhysicsPublication),
"get_StagingCache",
removeCells + 1);
Assert.True(stagedCache >= 0);
Assert.True(stagedCache < removeCells);
Assert.True(removeCells < secondStagedCache);
Assert.True(secondStagedCache < removeBuildings);
AssertNoCall(
publisherCalls,
typeof(ShadowObjectRegistry),
nameof(ShadowObjectRegistry.RefloodLandblock));
Assert.Contains(
publisherCalls,
call => call.Target.DeclaringType == typeof(RuntimePhysicsState)
&& call.Target.Name == "CommitCollisionGeneration");
AssertNoCall(
publisherCalls,
typeof(RuntimePhysicsState),
"RestartCollisionRetainedOwnerCapture");
}
private static void Publish(
@ -1500,15 +1531,14 @@ public sealed class LandblockPhysicsPublisherTests
Height = new byte[81],
};
private static string FindRepoRoot()
private static void AssertNoCall(
IReadOnlyList<CompiledCall> calls,
Type declaringType,
string methodName)
{
string? directory = AppContext.BaseDirectory;
while (directory is not null)
{
if (File.Exists(Path.Combine(directory, "AcDream.slnx")))
return directory;
directory = Directory.GetParent(directory)?.FullName;
}
throw new DirectoryNotFoundException("Could not locate repository root.");
Assert.DoesNotContain(
calls,
call => call.Target.DeclaringType == declaringType
&& call.Target.Name == methodName);
}
}