using Chessistics.Engine.Model; using Chessistics.Engine.Rules; using Xunit; namespace Chessistics.Tests.Rules; public class CollisionResolverTests { [Fact] public void NoCollision_PiecesOnDifferentCells() { var pieces = new List { new(1, PieceKind.Rook, new Coords(0, 0), new Coords(1, 0), 0) { CurrentCell = new Coords(0, 0) }, new(2, PieceKind.Rook, new Coords(2, 0), new Coords(3, 0), 1) { CurrentCell = new Coords(2, 0) } }; var results = CollisionResolver.ResolveCollisions(pieces); Assert.Empty(results); } [Fact] public void HigherStatus_Survives() { var cell = new Coords(1, 0); var rook = new PieceState(1, PieceKind.Rook, new Coords(0, 0), cell, 0) { CurrentCell = cell }; var knight = new PieceState(2, PieceKind.Knight, new Coords(2, 0), cell, 1) { CurrentCell = cell }; var pieces = new List { rook, knight }; var results = CollisionResolver.ResolveCollisions(pieces); Assert.Single(results); var (survivor, destroyed, resultCell) = results[0]; Assert.Equal(rook, survivor); Assert.Single(destroyed); Assert.Equal(knight, destroyed[0]); Assert.Equal(cell, resultCell); } [Fact] public void SameStatusAndLevel_MutualDestruction() { var cell = new Coords(1, 0); var pieces = new List { new(1, PieceKind.Knight, new Coords(0, 0), cell, 0) { CurrentCell = cell }, new(2, PieceKind.Bishop, new Coords(2, 0), cell, 1) { CurrentCell = cell } }; var results = CollisionResolver.ResolveCollisions(pieces); Assert.Single(results); var (survivor, destroyed, _) = results[0]; Assert.Null(survivor); Assert.Equal(2, destroyed.Count); } [Fact] public void HigherLevel_SurvivesWhenSameStatus() { var cell = new Coords(1, 0); var knightL2 = new PieceState(1, PieceKind.Knight, new Coords(0, 0), cell, 0, level: 2) { CurrentCell = cell }; var knightL1 = new PieceState(2, PieceKind.Knight, new Coords(2, 0), cell, 1, level: 1) { CurrentCell = cell }; var pieces = new List { knightL1, knightL2 }; var results = CollisionResolver.ResolveCollisions(pieces); Assert.Single(results); var (survivor, destroyed, _) = results[0]; Assert.Equal(knightL2, survivor); Assert.Single(destroyed); Assert.Equal(knightL1, destroyed[0]); } [Fact] public void ThreePieces_StrongestSurvives_OthersDestroyed() { var cell = new Coords(1, 0); var rook = new PieceState(1, PieceKind.Rook, new Coords(0, 0), cell, 0) { CurrentCell = cell }; var bishop = new PieceState(2, PieceKind.Bishop, new Coords(2, 0), cell, 1) { CurrentCell = cell }; var knight = new PieceState(3, PieceKind.Knight, new Coords(3, 0), cell, 2) { CurrentCell = cell }; var pieces = new List { rook, bishop, knight }; var results = CollisionResolver.ResolveCollisions(pieces); Assert.Single(results); var (survivor, destroyed, _) = results[0]; Assert.Equal(rook, survivor); Assert.Equal(2, destroyed.Count); } }