namespace AcDream.App.Tests.Runtime; public sealed class RuntimeCharacterOwnershipTests { [Fact] public void ProductionConstructsOnlyTheRuntimeCharacterOwner() { string source = ReadSource("Rendering", "GameWindow.cs"); Assert.Contains( "private readonly GameRuntime _runtime;", source, StringComparison.Ordinal); Assert.Contains( "_runtime = new GameRuntime(new GameRuntimeDependencies(", source, StringComparison.Ordinal); Assert.DoesNotContain( "new RuntimeCharacterState(", source, StringComparison.Ordinal); Assert.DoesNotContain( "new AcDream.Core.Spells.Spellbook", source, StringComparison.Ordinal); Assert.DoesNotContain( "new AcDream.Core.Player.LocalPlayerState", source, StringComparison.Ordinal); Assert.Contains( "SpellBook =>\n _runtimeCharacter.Spellbook;", Normalize(source), StringComparison.Ordinal); Assert.Contains( "LocalPlayer =>\n _runtimeCharacter.LocalPlayer;", Normalize(source), StringComparison.Ordinal); } [Fact] public void SessionRoutingAndShutdownBorrowTheExactRuntimeOwner() { string session = ReadSource("Net", "LiveSessionRuntimeFactory.cs"); string router = ReadRuntimeSource( "Session", "LiveSessionEventRouter.cs"); string content = ReadSource( "Composition", "ContentEffectsAudioComposition.cs"); string ui = ReadSource( "Composition", "InteractionRetainedUiComposition.cs"); string inventory = ReadRuntimeSource( "Gameplay", "RuntimeInventoryState.cs"); string shutdown = ReadSource("Rendering", "GameWindowLifetime.cs"); Assert.Contains( "RuntimeCharacterState Character", session, StringComparison.Ordinal); Assert.Contains( "character.Character.Spellbook", router, StringComparison.Ordinal); Assert.Contains( "character.Character.LocalPlayer", router, StringComparison.Ordinal); Assert.Contains( "_factory.InstallSpellMetadata(_dependencies.Character, magic)", content, StringComparison.Ordinal); Assert.Contains( "d.Character.Spellbook", ui, StringComparison.Ordinal); Assert.Contains( "d.Character.LocalPlayer", ui, StringComparison.Ordinal); Assert.DoesNotContain( "DesiredComponentState", inventory, StringComparison.Ordinal); Assert.Contains( "new ResourceShutdownStage(\"game runtime root\"", shutdown, StringComparison.Ordinal); Assert.DoesNotContain( "RuntimeCharacterState Character", shutdown, StringComparison.Ordinal); } [Fact] public void AppCharacterOptionAndMovementSkillOwnersWereDeleted() { string gameWindow = ReadSource("Rendering", "GameWindow.cs"); string sources = ReadSource( "Composition", "InteractionUiRuntimeSources.cs"); string playerState = ReadSource("Input", "LocalPlayerRuntimeState.cs"); string session = ReadSource("Net", "LiveSessionRuntimeFactory.cs"); string router = ReadRuntimeSource( "Session", "LiveSessionEventRouter.cs"); Assert.DoesNotContain( "PlayerCharacterOptionsState", gameWindow + sources + session, StringComparison.Ordinal); Assert.DoesNotContain( "LocalPlayerSkillState", gameWindow + playerState + session, StringComparison.Ordinal); Assert.Contains( "character.Character.Options.Replace", router, StringComparison.Ordinal); Assert.Contains( "character.Character.MovementSkills.Update", router, StringComparison.Ordinal); } private static string ReadSource(params string[] relative) => File.ReadAllText(Path.Combine( [FindRepositoryRoot(), "src", "AcDream.App", .. relative])); private static string ReadRuntimeSource(params string[] relative) => File.ReadAllText(Path.Combine( [FindRepositoryRoot(), "src", "AcDream.Runtime", .. relative])); private static string Normalize(string source) => source.Replace("\r\n", "\n", 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."); } }