using Minesweeper.Game; using Xunit; namespace Minesweeper.Tests; public class DifficultyTests { [Theory] [InlineData("beginner", 9, 9, 10)] [InlineData("NOVICE", 9, 9, 10)] [InlineData("1", 9, 9, 10)] [InlineData("intermediate", 16, 16, 40)] [InlineData("normal", 16, 16, 40)] [InlineData("2", 16, 16, 40)] [InlineData("expert", 30, 16, 99)] [InlineData("e", 30, 16, 99)] [InlineData("3", 30, 16, 99)] [InlineData("14x10x25", 14, 10, 25)] [InlineData("12x8", 12, 8, 14)] [InlineData("10,10,20", 10, 10, 20)] public void NamesResolve(string value, int width, int height, int mines) { Assert.True(DifficultyProfile.TryResolve(value, out var profile, out var error)); Assert.Null(error); Assert.Equal(width, profile!.Width); Assert.Equal(height, profile.Height); Assert.Equal(mines, profile.Mines); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData("banana")] [InlineData("16x16x900")] [InlineData("300x300x10")] [InlineData("16x16xzero")] public void BadNamesAreRejected(string value) { Assert.False(DifficultyProfile.TryResolve(value, out var profile, out var error)); Assert.Null(profile); Assert.False(string.IsNullOrWhiteSpace(error)); } [Fact] public void PresetsMatchTheClassicBoards() { Assert.Equal( new[] { "Beginner", "Intermediate", "Expert" }, DifficultyProfile.Presets.Select(preset => preset.Name)); Assert.Equal("30x16", DifficultyProfile.Expert.SizeLabel); } }