acdream/tests/AcDream.App.Tests/Runtime/RuntimePhysicsOwnershipTests.cs
Erik cdee7a4b49 refactor(runtime): close simulation ownership
Move remote-motion construction, CreateObject vector initialization, final simulation-component retirement, and the combined J5 ownership ledger into Runtime. Delete App compatibility views and moved-state reconstruction while preserving the existing graphical projection and retail update order.
2026-07-26 15:53:31 +02:00

216 lines
7.3 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"));
string app = string.Join(
"\n",
Directory.EnumerateFiles(
appRoot,
"*.cs",
SearchOption.AllDirectories)
.Select(File.ReadAllText));
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);
Assert.Contains(
"GetOrCreateRemoteMotion(",
runtimePhysics,
StringComparison.Ordinal);
Assert.Contains(
"_physics.TryCommitAuthoritativeVector(",
liveRuntime,
StringComparison.Ordinal);
Assert.DoesNotContain(
"TryActivateOrdinaryObject(",
liveRuntime,
StringComparison.Ordinal);
Assert.Contains(
"_entityObjects.CompleteProjectionRetirement(",
liveRuntime,
StringComparison.Ordinal);
Assert.DoesNotContain(
"record.RemoteMotionRuntime =",
liveRuntime,
StringComparison.Ordinal);
Assert.DoesNotContain(
"record.PhysicsBody =",
liveRuntime,
StringComparison.Ordinal);
Assert.DoesNotContain(
"new RemoteMotion(",
app,
StringComparison.Ordinal);
Assert.DoesNotContain(
"LiveEntityRemoteMotionRuntimeView",
app,
StringComparison.Ordinal);
Assert.DoesNotContain(
"ILiveEntityRemoteMotionRuntime",
app,
StringComparison.Ordinal);
Assert.DoesNotContain(
"ILiveEntityRemotePlacementRuntime",
app,
StringComparison.Ordinal);
Assert.DoesNotContain(
"LocalPlayerControllerSlot",
app,
StringComparison.Ordinal);
Assert.DoesNotContain(
"ILocalPlayerControllerSource",
app,
StringComparison.Ordinal);
Assert.False(File.Exists(Path.Combine(
appRoot,
"Physics",
"RemotePhysicsBodyInitializer.cs")));
Assert.False(typeof(AcDream.App.World.LiveEntityRecord)
.GetProperty(nameof(AcDream.App.World.LiveEntityRecord.PhysicsBody))!
.CanWrite);
Assert.False(typeof(AcDream.App.World.LiveEntityRecord)
.GetProperty(nameof(AcDream.App.World.LiveEntityRecord.RemoteMotionRuntime))!
.CanWrite);
Assert.False(typeof(AcDream.App.World.LiveEntityRecord)
.GetProperty(nameof(AcDream.App.World.LiveEntityRecord.PhysicsHost))!
.CanWrite);
}
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.");
}
}