public async Task Player0Wins() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ b b g ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ g ⬡ S Q ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ g q S S S b ⬡ ⬡ "; initial += " ⬡ ⬡ g g G G ⬡ ⬡ ⬡ ⬡"; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ b b g ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ g ✔ S Q ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ g q S S S b ⬡ ⬡ "; expected += " ⬡ ⬡ g g ★ G ⬡ ⬡ ⬡ ⬡"; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task QueenMovesAway() { var initial = new InitialHiveBuilder(); initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ S ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ s s s Q ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ s s ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ q ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; var expected = new ExpectedAiBuilder(); expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ S ⬡ ✔ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ s s s ★ ✔ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ s s ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ q ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task AntsAreScoreHighlyOncePlaced() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ A B a ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ B ⬡ Q ⬡ ⬡"; initial += "⬡ ⬡ q B B a ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ★ B a ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ B ⬡ Q ⬡ ⬡"; expected += "⬡ ✔ q B B a ⬡ ⬡ "; expected += " ⬡ ✔ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task PiecesMoveTowardQueenUnderBeetle() { var initial = new InitialHiveBuilder(); initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ A g ⬡ ⬡ ⬡"; initial += "⬡ ⬡ Q s s B ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ G ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var beetleCell = initial.AllCells.First(c => c.Tiles.Any(t => t.Creature.Name == Creatures.Beetle.Name)); var beetle = beetleCell.RemoveTopTile(); beetleCell.AddTile(new Tile(13, 1, Creatures.Queen)); beetleCell.AddTile(beetle); var expected = new ExpectedAiBuilder(); expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ★ g ⬡ ⬡ ⬡"; expected += "⬡ ⬡ Q s s B ✔ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ✔ G ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task MovesToEnemyQueen() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ A ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ g ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ q g g Q A ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ★ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ✔ ✔ g ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ✔ q g g Q ★ ⬡ "; expected += " ⬡ ✔ ✔ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task MovesBeetleOnTopOfQueen2() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ A ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ b ⬡ ⬡ ⬡ ⬡"; initial += "⬡ g Q b b q B ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ A ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ b ⬡ ⬡ ⬡ ⬡"; expected += "⬡ g Q b b ✔ ★ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().BeetleOnToQueen(initial, expected); }
public AndConstraint <AiAssertions> MatchHive(InitialHiveBuilder initialBuilder, ExpectedAiBuilder expected) { var expectedMoves = expected.ExpectedMoves(); var expectedTiles = initialBuilder.AllCells.Where(c => expected.OriginCells.Contains(c)) .Select(c => (c.Coords, Tile: c.TopTile())) .ToHashSet(); expectedTiles.UnionWith(expected.PlayerTrayMoves); Execute.Assertion.Given(() => Subject()) .ForCondition(result => expectedTiles.Any(t => t.Tile.Id == result.Tile.Id) && expectedMoves.Contains(result.Coords)) .FailWith( "\nResulting " + Identifier + "s did not match expected\n\nInitial:\n{1}\n\nActual - Expected:\n{2}\n", _ => initialBuilder.OriginCells.Count, _ => new StringBuilder(initialBuilder.ToColoredString(initialBuilder.ToString())), actual => new StringBuilder(expected.GetMoveDiff(expectedTiles, actual)) ); return(new AndConstraint <AiAssertions>(this)); }
public async Task OpponentNoMoves() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ A q A ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ✔ ⬡ ⬡ ✔ ⬡ ⬡ "; expected += " ⬡ ✔ A q A ✔ ⬡ ⬡"; expected += "⬡ ⬡ ✔ ⬡ ⬡ ✔ ⬡ ⬡ "; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var tile = new Tile(50, 0, Creatures.Ant); var player1 = new Player(0, "P1") with { Tiles = new HashSet <Tile> { tile } }; var hive = HiveFactory.CreateInProgress(new[] { player1, new Player(1, "P1") }, initial.AllCells, 0); foreach (var tileMove in hive.Players.First().Tiles) { foreach (var coords in tileMove.Moves) { initial.AddPlayerTrayOriginMove(coords); expected.PlayerTrayMoves.Add((coords, tileMove)); } } var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task MovesToQueenWithPlayerTiles() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ A g ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ s ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ q s s Q G ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ A g ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ s ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ✔ q s s Q ★ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var player1 = new Player(0, "P1") with { Tiles = new HashSet <Tile> { new(50, 0, Creatures.Grasshopper) } }; var player2 = new Player(1, "P2") with { Tiles = new HashSet <Tile> { new(51, 1, Creatures.Grasshopper) } }; var hive = HiveFactory.CreateInProgress(new[] { player1, player2 }, initial.AllCells, 0); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().MatchHive(initial, expected); }
public async Task BeetleStaysOnTopOfQueenPlayer2() { var initial = new InitialHiveBuilder(); initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ a ⬡ ⬡ ⬡ ⬡ "; initial += " ⬡ ⬡ ⬡ S ⬡ ⬡ ⬡ ⬡"; initial += "⬡ G q S S S b ⬡ "; initial += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; initial += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var beetleCell = initial.AllCells.First(c => c.Tiles.Any(t => t.Creature.Name == Creatures.Beetle.Name)); var beetle = beetleCell.RemoveTopTile(); beetleCell.AddTile(new Tile(11, 0, Creatures.Queen)); beetleCell.AddTile(beetle); var expected = new ExpectedAiBuilder(); expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡"; expected += "⬡ ⬡ ⬡ ★ ⬡ ⬡ ⬡ ⬡ "; expected += " ⬡ ⬡ ⬡ S ⬡ ✔ ✔ ⬡"; expected += "⬡ G q S S S b ✔ "; expected += " ⬡ ⬡ ⬡ ⬡ ⬡ ✔ ✔ ⬡"; expected += "⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ ⬡ "; var hive = HiveFactory.CreateInProgress(new[] { new Player(0, "P1"), new Player(1, "P1") }, initial.AllCells, 1); var player = new ComputerPlayer(hive); (await player.GetMove()).Should().BeetleOnQueen(initial, expected); }
public AndConstraint <AiAssertions> BeetleOnToQueen(InitialHiveBuilder initialBuilder, ExpectedAiBuilder expected) { var queenCell = initialBuilder.AllCells.Where(c => !c.IsEmpty() && c.Tiles.Any(t => t.Creature.Name == Creatures.Queen.Name)); var beetleCell = initialBuilder.AllCells.Where(c => !c.IsEmpty() && c.Tiles.Any(t => t.Creature.Name == Creatures.Beetle.Name)) .Select(c => c.TopTile()); Execute.Assertion.Given(() => Subject()) .ForCondition(result => queenCell.Any(c => c.Coords == result.Coords) && beetleCell.Any(t => t.Id == result.Tile.Id)) .FailWith( "\nResulting " + Identifier + "s did not match expected\n\nInitial:\n{1}\n\nActual - Expected:\n{2}\n", _ => initialBuilder.OriginCells.Count, _ => new StringBuilder(initialBuilder.ToColoredString(initialBuilder.ToString())), actual => new StringBuilder(expected.GetMoveDiff(new HashSet <(Coords Coords, Tile Tile)>(), actual)) ); return(new AndConstraint <AiAssertions>(this)); }