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>
148 lines
4.9 KiB
C#
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.");
|
|
}
|
|
}
|