using Ludarium.Application; namespace Ludarium.UnitTests; public sealed class DolphinLaunchPolicyTests { [Fact] public void UniqueReadOnlyFixtureIsReleaseEligible() { var gameId = Guid.NewGuid(); var candidate = Candidate("roms/wii/Synthetic.wbfs", true); var capability = DolphinLaunchPolicy.EvaluateCapability(gameId, "wii", true, [candidate], DateTimeOffset.UnixEpoch, vaultBacked: true); Assert.True(capability.Available); Assert.True(capability.AutomaticRestore); Assert.Equal("Dolphin", capability.Emulator); Assert.Equal("dolphin", capability.Player); Assert.Equal("wii", capability.Platform); Assert.True(capability.SupportsSavestates); // Automatic restore is a live runtime property, never an assumption about the sidecar. Assert.False(DolphinLaunchPolicy.EvaluateCapability(gameId, "wii", true, [candidate], DateTimeOffset.UnixEpoch).AutomaticRestore); Assert.Equal("wii/Synthetic.wbfs", DolphinLaunchPolicy.ToRuntimePath("wii", candidate.RelativePath, "roms/wii")); } [Fact] public void AmbiguousWritableAndUnsafeSourcesFailClosed() { var first = Candidate("roms/gamecube/One.rvz", true); var second = Candidate("roms/gamecube/Two.iso", true); Assert.Null(DolphinLaunchPolicy.SelectGame([first, second])); Assert.Null(DolphinLaunchPolicy.SelectGame([first with { SourceReadOnly = false }])); Assert.Null(DolphinLaunchPolicy.SelectGame([first with { RelativePath = "../One.rvz" }])); Assert.False(DolphinLaunchPolicy.EvaluateCapability(Guid.NewGuid(), "gamecube", true, [first, second]).Available); } [Theory] [InlineData("ps2", true, NativeRemotePlayState.UnsupportedPlatform)] [InlineData("wii", false, NativeRemotePlayState.RuntimeUnavailable)] public void UnsupportedPlatformAndMissingRuntimeStayUnavailable(string platform, bool runtime, NativeRemotePlayState state) { var capability = DolphinLaunchPolicy.EvaluateCapability(Guid.NewGuid(), platform, runtime, []); Assert.Equal(state, capability.State); } private static NativeLaunchCandidate Candidate(string path, bool readOnly) => new(Guid.NewGuid(), path, 2 * 1024 * 1024, readOnly); }