acdream/tests/AcDream.App.Tests/Runtime/RuntimePhysicsOwnershipTests.cs
Erik 7e6033d0ad refactor(runtime): own per-session physics simulation
Move the sole PhysicsEngine, production cache, collision admissions, canonical bodies and hosts, remote components, ordinary/remote worksets, simulation, cell commits, and shadow synchronization under RuntimeEntityObjectLifetime. Keep App as the prepared-asset, animation-input, and render-projection adapter while preserving the named-retail update and collision order.

Add exact-incarnation, object-clock, callback-reentrancy, GUID-reuse, two-runtime isolation, source ownership, collision publication, and graphical projection coverage. Release build and the complete 8,588-test solution pass.

Co-authored-by: Codex <noreply@openai.com>
2026-07-26 13:39:57 +02:00

148 lines
4.9 KiB
C#

using System.Text.RegularExpressions;
namespace AcDream.App.Tests.Runtime;
public sealed class RuntimePhysicsOwnershipTests
{
[Fact]
public void ProductionAppBorrowsTheRuntimePhysicsWorld()
{
string root = FindRepositoryRoot();
string appRoot = Path.Combine(root, "src", "AcDream.App");
string gameWindow = File.ReadAllText(Path.Combine(
appRoot,
"Rendering",
"GameWindow.cs"));
string app = string.Join(
"\n",
Directory.EnumerateFiles(appRoot, "*.cs", SearchOption.AllDirectories)
.Select(File.ReadAllText));
Assert.Empty(Regex.Matches(
app,
@"new\s+(?:AcDream\.Core\.Physics\.)?PhysicsEngine\s*(?:\(|\{)"));
Assert.DoesNotContain(
"PhysicsDataCache.CreateProduction()",
app,
StringComparison.Ordinal);
Assert.Contains(
"_runtimeEntityObjects.Physics.Engine",
gameWindow,
StringComparison.Ordinal);
Assert.Contains(
"_runtimeEntityObjects.Physics.DataCache",
gameWindow,
StringComparison.Ordinal);
}
[Fact]
public void AppPhysicsFilesArePresentationAndPreparedAssetAdapters()
{
string root = FindRepositoryRoot();
string appRoot = Path.Combine(root, "src", "AcDream.App");
string runtimeRoot = Path.Combine(root, "src", "AcDream.Runtime");
string remoteAdapter = File.ReadAllText(Path.Combine(
appRoot,
"Physics",
"RemotePhysicsUpdater.cs"));
string ordinaryAdapter = File.ReadAllText(Path.Combine(
appRoot,
"Physics",
"LiveEntityOrdinaryPhysicsUpdater.cs"));
string liveRuntime = File.ReadAllText(Path.Combine(
appRoot,
"World",
"LiveEntityRuntime.cs"));
string collisionPublisher = File.ReadAllText(Path.Combine(
appRoot,
"Streaming",
"LandblockPhysicsPublisher.cs"));
string runtimeRemote = File.ReadAllText(Path.Combine(
runtimeRoot,
"Physics",
"RuntimeRemotePhysicsUpdater.cs"));
string runtimeOrdinary = File.ReadAllText(Path.Combine(
runtimeRoot,
"Physics",
"RuntimeOrdinaryPhysicsUpdater.cs"));
string runtimePhysics = File.ReadAllText(Path.Combine(
runtimeRoot,
"Physics",
"RuntimePhysicsState.cs"));
Assert.DoesNotContain(
"ResolveWithTransition(",
remoteAdapter,
StringComparison.Ordinal);
Assert.DoesNotContain(
"RetailObjectManagerTail.Run(",
remoteAdapter,
StringComparison.Ordinal);
Assert.Contains(
"ResolveWithTransition(",
runtimeRemote,
StringComparison.Ordinal);
Assert.Contains(
"RetailObjectManagerTail.Run(",
runtimeRemote,
StringComparison.Ordinal);
Assert.DoesNotContain(
"ResolveWithTransition(",
ordinaryAdapter,
StringComparison.Ordinal);
Assert.DoesNotContain(
"RebucketLiveEntity(",
ordinaryAdapter,
StringComparison.Ordinal);
Assert.Contains(
"ResolveWithTransition(",
runtimeOrdinary,
StringComparison.Ordinal);
Assert.Contains(
"_physics.GetOrCreatePhysicsBody(",
liveRuntime,
StringComparison.Ordinal);
Assert.Contains(
"_physics.TryGetPhysicsHost(",
liveRuntime,
StringComparison.Ordinal);
Assert.Contains(
"BeginCollisionAdmission(",
collisionPublisher,
StringComparison.Ordinal);
Assert.Contains(
"AdmitCollisionAssets(",
collisionPublisher,
StringComparison.Ordinal);
Assert.DoesNotContain(
".AddLandblock(",
collisionPublisher,
StringComparison.Ordinal);
Assert.DoesNotContain(
".RemoveLandblock(",
collisionPublisher,
StringComparison.Ordinal);
Assert.Contains(
"public PhysicsBody GetOrCreatePhysicsBody(",
runtimePhysics,
StringComparison.Ordinal);
Assert.Contains(
"public bool TryGetPhysicsHost(",
runtimePhysics,
StringComparison.Ordinal);
}
private static string FindRepositoryRoot()
{
var current = new DirectoryInfo(AppContext.BaseDirectory);
while (current is not null)
{
if (File.Exists(Path.Combine(current.FullName, "AcDream.slnx")))
return current.FullName;
current = current.Parent;
}
throw new DirectoryNotFoundException("AcDream.slnx was not found.");
}
}