Files
Ludarium release export df869819ce
Public source validation / source (push) Successful in 2m16s
Publish Ludarium source
2026-09-03 02:08:58 +02:00

78 lines
3.4 KiB
C#

using Ludarium.Application;
namespace Ludarium.UnitTests;
public sealed class SwitchLaunchPolicyTests
{
[Fact]
public void SelectsUniqueReadOnlyBaseXciAndRejectsTicketUpdateAndDlc()
{
var candidates = new[]
{
Candidate("Animal Crossing ticket [01006F800232712C][v0].nsp", 124_112),
Candidate("Animal Crossing update [01006F8002326800][v1769472].nsp", 4_332_291_043),
Candidate("Happy Home Paradise [01006F80023273E8][v0].nsp", 624_384_208),
Candidate("Animal Crossing New Horizons [01006F8002326000][v0].xci", 7_985_954_816),
};
Assert.EndsWith(".xci", SwitchLaunchPolicy.SelectBaseGame(candidates)!.RelativePath);
}
[Fact]
public void FailsClosedWhenTheBaseGameIsAmbiguousOrWritable()
{
var first = Candidate("Game A [0100000000000000][v0].xci", 2_000_000);
var second = Candidate("Game B [0100000000010000][v0].xci", 3_000_000);
Assert.Null(SwitchLaunchPolicy.SelectBaseGame([first, second]));
Assert.Null(SwitchLaunchPolicy.SelectBaseGame([first with { SourceReadOnly = false }]));
}
[Fact]
public void MapsOnlyContainedCatalogPaths()
{
Assert.Equal("Animal/Game [0100000000000000][v0].xci",
SwitchLaunchPolicy.ToRuntimePath("roms/switch/Animal/Game [0100000000000000][v0].xci", "roms/switch"));
Assert.Throws<InvalidOperationException>(() => SwitchLaunchPolicy.ToRuntimePath("roms/ps5/game.xci", "roms/switch"));
}
[Fact]
public void CapabilityIsAvailableOnlyForOneQualifiedBaseGame()
{
var gameId = Guid.NewGuid();
var available = SwitchLaunchPolicy.EvaluateCapability(gameId, true, true, true,
[Candidate("Game [0100000000000000][v0].xci", 2_000_000)]);
var ambiguous = SwitchLaunchPolicy.EvaluateCapability(gameId, true, true, true,
[Candidate("Game A [0100000000000000][v0].xci", 2_000_000), Candidate("Game B [0100000000010000][v0].xci", 3_000_000)]);
Assert.True(available.Available);
Assert.Equal(NativeRemotePlayState.Available, available.State);
Assert.False(ambiguous.Available);
Assert.Equal(NativeRemotePlayState.AmbiguousMapping, ambiguous.State);
}
[Theory]
[InlineData(false, true, true, NativeRemotePlayState.UnsupportedPlatform)]
[InlineData(true, false, true, NativeRemotePlayState.RuntimeUnavailable)]
[InlineData(true, true, false, NativeRemotePlayState.MissingKeys)]
public void CapabilityExplainsGlobalPrerequisites(bool isSwitch, bool runtime, bool keys,
NativeRemotePlayState expected)
{
var capability = SwitchLaunchPolicy.EvaluateCapability(Guid.NewGuid(), isSwitch, runtime, keys, []);
Assert.False(capability.Available);
Assert.Equal(expected, capability.State);
}
[Fact]
public void CapabilityDistinguishesAnUpdateWithoutItsBaseGameFromAmbiguity()
{
var capability = SwitchLaunchPolicy.EvaluateCapability(Guid.NewGuid(), true, true, true,
[Candidate("Game update [0100000000000800][v131072].nsp", 4_000_000)]);
Assert.False(capability.Available);
Assert.Equal(NativeRemotePlayState.MissingBaseGame, capability.State);
Assert.Contains("updates and DLC cannot start alone", capability.Message);
}
private static NativeLaunchCandidate Candidate(string path, long size) => new(Guid.NewGuid(), "roms/switch/" + path, size, true);
}