using Ludarium.Application; using Ludarium.Domain; namespace Ludarium.UnitTests; public sealed class GameDataVaultPolicyTests { [Fact] public void MetadataIsTrimmedAndBounded() { var result = GameDataVaultPolicy.Normalize(new GameDataEntryInput(GameDataKind.Save, " Main slot ", " mGBA ", " Steam Deck ", " Before the final dungeon ")); Assert.Equal("Main slot", result.Name); Assert.Equal("mGBA", result.Emulator); Assert.Equal("Steam Deck", result.Device); } [Theory] [InlineData("../slot.sav")] [InlineData("folder\\slot.sav")] [InlineData("payload.exe")] [InlineData("script.ps1")] public void UnsafeFileNamesAreRejected(string fileName) => Assert.Throws(() => GameDataVaultPolicy.ValidateFileName(fileName)); [Fact] public void NormalSaveFileNameIsPreserved() => Assert.Equal("campaign-slot-1.srm", GameDataVaultPolicy.ValidateFileName("campaign-slot-1.srm")); [Fact] public void UnknownKindIsRejected() => Assert.Throws(() => GameDataVaultPolicy.Normalize( new GameDataEntryInput((GameDataKind)999, "Slot", null, null, null))); }