From 9059ea7b9fbab827472f40f56deb8c116dfcc146 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 2 Dec 2023 11:05:34 -0600 Subject: [PATCH] feat: add logic for testing game possibility and summing possible games --- 01/Trebuchet.Tests/GlobalUsings.cs | 3 +- 02/CubeConundrum.Tests/GlobalUsings.cs | 3 +- .../PartOnePuzzleSolverTests.cs | 159 ++++++++++++++++++ 02/CubeConundrum.Tests/PuzzleParserTests.cs | 117 +++++++------ 02/CubeConundrum.Tests/ResultTests.cs | 23 +++ 02/CubeConundrum/Program.cs | 18 ++ 6 files changed, 262 insertions(+), 61 deletions(-) create mode 100644 02/CubeConundrum.Tests/PartOnePuzzleSolverTests.cs create mode 100644 02/CubeConundrum.Tests/ResultTests.cs diff --git a/01/Trebuchet.Tests/GlobalUsings.cs b/01/Trebuchet.Tests/GlobalUsings.cs index 7fef4b0..2d5b473 100644 --- a/01/Trebuchet.Tests/GlobalUsings.cs +++ b/01/Trebuchet.Tests/GlobalUsings.cs @@ -1,2 +1,3 @@ +global using FluentAssertions; + global using Xunit; -global using FluentAssertions; \ No newline at end of file diff --git a/02/CubeConundrum.Tests/GlobalUsings.cs b/02/CubeConundrum.Tests/GlobalUsings.cs index 7fef4b0..2d5b473 100644 --- a/02/CubeConundrum.Tests/GlobalUsings.cs +++ b/02/CubeConundrum.Tests/GlobalUsings.cs @@ -1,2 +1,3 @@ +global using FluentAssertions; + global using Xunit; -global using FluentAssertions; \ No newline at end of file diff --git a/02/CubeConundrum.Tests/PartOnePuzzleSolverTests.cs b/02/CubeConundrum.Tests/PartOnePuzzleSolverTests.cs new file mode 100644 index 0000000..ba7acaa --- /dev/null +++ b/02/CubeConundrum.Tests/PartOnePuzzleSolverTests.cs @@ -0,0 +1,159 @@ +namespace CubeConundrum.Tests; + +public class PartOnePuzzleSolverTests +{ + private readonly PartOnePuzzleSolver _sut = new(); + + [Theory, MemberData(nameof(TestData.Results), MemberType = typeof(TestData))] + public void IsResultPossible_GivenAResult_ItShouldReturnExpectedOutcome(Result givenResult, bool expected) + { + var result = _sut.IsResultPossible(givenResult); + result.Should().Be(expected); + } + + [Theory, MemberData(nameof(TestData.Games), MemberType = typeof(TestData))] + public void IsGamePossible_GivenAGame_ItShouldReturnExpectedOutcome(Game givenGame, bool expected) + { + var result = _sut.IsGamePossible(givenGame); + result.Should().Be(expected); + } + + [Fact] + public void SumPossibleGameIds_GivenAGameCollection_ItShouldReturnTheSumOfTheIdsOfAllPossibleGames() + { + var games = TestData.Games.Select(o => (Game)o[0]); + var result = _sut.SumPossibleGameIds(games); + result.Should().Be(1); + } + + public static class TestData + { + public static readonly IEnumerable Games = new List + { + new object[] + { + new Game + { + Id = 1, + Results = + { + new() + { + Cubes = + { + new() { Count = 3, Color = CubeColor.Blue }, + new() { Count = 4, Color = CubeColor.Red } + } + }, + new() + { + Cubes = + { + new() { Count = 1, Color = CubeColor.Red }, + new() { Count = 2, Color = CubeColor.Green }, + new() { Count = 6, Color = CubeColor.Blue } + } + }, + new() + { + Cubes = + { + new() { Count = 2, Color = CubeColor.Green } + } + } + } + }, + true + }, + new object[] + { + new Game + { + Id = 2, + Results = + { + new() + { + Cubes = + { + new() { Count = 3, Color = CubeColor.Blue }, + new() { Count = 4, Color = CubeColor.Red } + } + }, + new() + { + Cubes = + { + new() { Count = 1, Color = CubeColor.Red }, + new() { Count = 2, Color = CubeColor.Green }, + new() { Count = 6, Color = CubeColor.Blue } + } + }, + new() + { + Cubes = + { + new() { Count = 40, Color = CubeColor.Green } + } + }, + } + }, + false + }, + }; + + public static readonly IEnumerable Results = new List + { + new object[] + { + new Result + { + Cubes = + { + new() { Count = 4, Color = CubeColor.Red }, + new() { Count = 1, Color = CubeColor.Green }, + new() { Count = 2, Color = CubeColor.Blue } + } + }, + true + }, + new object[] + { + new Result + { + Cubes = + { + new() { Count = 13, Color = CubeColor.Red }, + new() { Count = 14, Color = CubeColor.Green }, + new() { Count = 14, Color = CubeColor.Blue }, + } + }, + false + }, + new object[] + { + new Result + { + Cubes = + { + new() { Count = 13, Color = CubeColor.Red }, + new() { Count = 5, Color = CubeColor.Green }, + new() { Count = 5, Color = CubeColor.Blue }, + } + }, + false + }, + new object[] + { + new Result + { + Cubes = + { + new() { Count = 40, Color = CubeColor.Red }, + } + }, + false + } + }; + } +} \ No newline at end of file diff --git a/02/CubeConundrum.Tests/PuzzleParserTests.cs b/02/CubeConundrum.Tests/PuzzleParserTests.cs index 22bdd05..5ac4fa8 100644 --- a/02/CubeConundrum.Tests/PuzzleParserTests.cs +++ b/02/CubeConundrum.Tests/PuzzleParserTests.cs @@ -24,71 +24,70 @@ public class PuzzleParserTests var result = _sut.ParseGame(input); result.Should().BeEquivalentTo(expected); } -} -public static class TestData -{ - public static readonly IEnumerable CubeStrings = new List + public static class TestData { - new object[] { "4 red", new Cube { Count = 4, Color = CubeColor.Red } }, - new object[] { "1 green", new Cube { Count = 1, Color = CubeColor.Green } }, - new object[] { "2 blue", new Cube { Count = 2, Color = CubeColor.Blue } } - }; - - public static readonly IEnumerable ResultStrings = new List - { - new object[] + public static readonly IEnumerable CubeStrings = new List { - "4 red, 1 green, 2 blue", - new Result - { - Cubes = - [ - new (){ Count = 4, Color = CubeColor.Red }, - new (){ Count = 1, Color = CubeColor.Green }, - new() { Count = 2, Color = CubeColor.Blue } - ] - } - } - }; + new object[] { "4 red", new Cube { Count = 4, Color = CubeColor.Red } }, + new object[] { "1 green", new Cube { Count = 1, Color = CubeColor.Green } }, + new object[] { "2 blue", new Cube { Count = 2, Color = CubeColor.Blue } } + }; - public static readonly IEnumerable GameStrings = new List - { - new object[] + public static readonly IEnumerable ResultStrings = new List { - "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", - new Game + new object[] { - Id = 1, - Results = - [ - new() - { - Cubes = - [ - new() { Count = 3, Color = CubeColor.Blue }, - new() { Count = 4, Color = CubeColor.Red } - ] - }, - new Result - { - Cubes = - [ - new() { Count = 1, Color = CubeColor.Red }, - new() { Count = 2, Color = CubeColor.Green }, - new() { Count = 6, Color = CubeColor.Blue } - ] - }, - new Result - { - Cubes = - [ - new(){ Count = 2, Color = CubeColor.Green } - ] - } - ] + "4 red, 1 green, 2 blue", + new Result + { + Cubes = + [ + new (){ Count = 4, Color = CubeColor.Red }, + new (){ Count = 1, Color = CubeColor.Green }, + new() { Count = 2, Color = CubeColor.Blue } + ] + } } - } - }; + }; + public static readonly IEnumerable GameStrings = new List + { + new object[] + { + "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", + new Game + { + Id = 1, + Results = + [ + new() + { + Cubes = + [ + new() { Count = 3, Color = CubeColor.Blue }, + new() { Count = 4, Color = CubeColor.Red } + ] + }, + new Result + { + Cubes = + [ + new() { Count = 1, Color = CubeColor.Red }, + new() { Count = 2, Color = CubeColor.Green }, + new() { Count = 6, Color = CubeColor.Blue } + ] + }, + new Result + { + Cubes = + [ + new(){ Count = 2, Color = CubeColor.Green } + ] + } + ] + } + } + }; + } } \ No newline at end of file diff --git a/02/CubeConundrum.Tests/ResultTests.cs b/02/CubeConundrum.Tests/ResultTests.cs new file mode 100644 index 0000000..4aad52b --- /dev/null +++ b/02/CubeConundrum.Tests/ResultTests.cs @@ -0,0 +1,23 @@ +namespace CubeConundrum.Tests; + +public class ResultTests +{ + [Fact] + public void CountProperties_GivenAResult_ItShouldReturnTheCorrectCount() + { + var result = new Result + { + Cubes = + { + new() { Count = 4, Color = CubeColor.Red }, + new() { Count = 1, Color = CubeColor.Green }, + new() { Count = 2, Color = CubeColor.Blue } + } + }; + + result.TotalCubeCount.Should().Be(7); + result.RedCubeCount.Should().Be(4); + result.GreenCubeCount.Should().Be(1); + result.BlueCubeCount.Should().Be(2); + } +} \ No newline at end of file diff --git a/02/CubeConundrum/Program.cs b/02/CubeConundrum/Program.cs index f71439b..4b32802 100644 --- a/02/CubeConundrum/Program.cs +++ b/02/CubeConundrum/Program.cs @@ -10,7 +10,21 @@ public class Program public class PartOnePuzzleSolver { + private readonly int _maxCubeCount = 39; + private readonly int _maxRedCubeCount = 12; + private readonly int _maxGreenCubeCount = 13; + private readonly int _maxBlueCubeCount = 14; + public bool IsResultPossible(Result result) => result.TotalCubeCount <= _maxCubeCount + && result.RedCubeCount <= _maxRedCubeCount + && result.GreenCubeCount <= _maxGreenCubeCount + && result.BlueCubeCount <= _maxBlueCubeCount; + + public bool IsGamePossible(Game game) => game.Results.All(IsResultPossible); + + public int SumPossibleGameIds(IEnumerable games) => games + .Where(IsGamePossible) + .Sum(g => g.Id); } public class PuzzleParser @@ -69,6 +83,10 @@ public class Game public class Result { public List Cubes { get; set; } = []; + public int TotalCubeCount => Cubes.Sum(c => c.Count); + public int RedCubeCount => Cubes.Where(c => c.Color == CubeColor.Red).Sum(c => c.Count); + public int GreenCubeCount => Cubes.Where(c => c.Color == CubeColor.Green).Sum(c => c.Count); + public int BlueCubeCount => Cubes.Where(c => c.Color == CubeColor.Blue).Sum(c => c.Count); } public class Cube