Files
Shogi/Tests/UnitTests/RookShould.cs
2025-12-31 09:03:05 -06:00

224 lines
6.5 KiB
C#

using Shogi.BackEnd.Domains.ValueObjects;
using Shogi.BackEnd.Domains.ValueObjects.Movement;
using Shogi.BackEnd.Domains.ValueObjects.Pieces;
using System.Linq;
using System.Numerics;
namespace UnitTests;
public class RookShould
{
public class MoveSet
{
private readonly Rook rook1;
private readonly Rook rook2;
public MoveSet()
{
rook1 = new Rook(WhichPlayer.Player1);
rook2 = new Rook(WhichPlayer.Player2);
}
[Fact]
public void Player1_HasCorrectMoveSet()
{
var moveSet = rook1.MoveSet;
Assert.Equal(4, moveSet.Count);
Assert.Contains(new Path(Direction.Forward, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Left, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Right, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Backward, Distance.MultiStep), moveSet);
}
[Fact]
public void Player1_Promoted_HasCorrectMoveSet()
{
// Arrange
rook1.Promote();
Assert.True(rook1.IsPromoted);
// Assert
var moveSet = rook1.MoveSet;
Assert.Equal(8, moveSet.Count);
Assert.Contains(new Path(Direction.Forward, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Left, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Right, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Backward, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.ForwardLeft, Distance.OneStep), moveSet);
Assert.Contains(new Path(Direction.BackwardLeft, Distance.OneStep), moveSet);
Assert.Contains(new Path(Direction.ForwardRight, Distance.OneStep), moveSet);
Assert.Contains(new Path(Direction.BackwardRight, Distance.OneStep), moveSet);
}
[Fact]
public void Player2_HasCorrectMoveSet()
{
var moveSet = rook2.MoveSet;
Assert.Equal(4, moveSet.Count);
Assert.Contains(new Path(Direction.Forward, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Left, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Right, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Backward, Distance.MultiStep), moveSet);
}
[Fact]
public void Player2_Promoted_HasCorrectMoveSet()
{
// Arrange
rook2.Promote();
Assert.True(rook2.IsPromoted);
// Assert
var moveSet = rook2.MoveSet;
Assert.Equal(8, moveSet.Count);
Assert.Contains(new Path(Direction.Forward, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Left, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Right, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.Backward, Distance.MultiStep), moveSet);
Assert.Contains(new Path(Direction.ForwardLeft, Distance.OneStep), moveSet);
Assert.Contains(new Path(Direction.BackwardLeft, Distance.OneStep), moveSet);
Assert.Contains(new Path(Direction.ForwardRight, Distance.OneStep), moveSet);
Assert.Contains(new Path(Direction.BackwardRight, Distance.OneStep), moveSet);
}
}
private readonly Rook rookPlayer1;
public RookShould()
{
rookPlayer1 = new Rook(WhichPlayer.Player1);
}
[Fact]
public void Promote()
{
Assert.False(rookPlayer1.IsPromoted);
Assert.True(rookPlayer1.CanPromote);
rookPlayer1.Promote();
Assert.True(rookPlayer1.IsPromoted);
Assert.False(rookPlayer1.CanPromote);
}
[Fact]
public void GetStepsFromStartToEnd_Player1NotPromoted_LateralMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(0, 5);
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.False(rookPlayer1.IsPromoted);
Assert.Equal(5, steps.Count);
Assert.Contains(new Vector2(0, 1), steps);
Assert.Contains(new Vector2(0, 2), steps);
Assert.Contains(new Vector2(0, 3), steps);
Assert.Contains(new Vector2(0, 4), steps);
Assert.Contains(new Vector2(0, 5), steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player1NotPromoted_DiagonalMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(1, 1);
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.False(rookPlayer1.IsPromoted);
Assert.Empty(steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player1Promoted_LateralMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(0, 5);
rookPlayer1.Promote();
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.True(rookPlayer1.IsPromoted);
Assert.Equal(5, steps.Count);
Assert.Contains(new Vector2(0, 1), steps);
Assert.Contains(new Vector2(0, 2), steps);
Assert.Contains(new Vector2(0, 3), steps);
Assert.Contains(new Vector2(0, 4), steps);
Assert.Contains(new Vector2(0, 5), steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player1Promoted_DiagonalMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(1, 1);
rookPlayer1.Promote();
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.True(rookPlayer1.IsPromoted);
Assert.Single(steps);
Assert.Contains(new Vector2(1, 1), steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player2NotPromoted_LateralMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(0, 5);
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.False(rookPlayer1.IsPromoted);
Assert.Equal(5, steps.Count);
Assert.Contains(new Vector2(0, 1), steps);
Assert.Contains(new Vector2(0, 2), steps);
Assert.Contains(new Vector2(0, 3), steps);
Assert.Contains(new Vector2(0, 4), steps);
Assert.Contains(new Vector2(0, 5), steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player2NotPromoted_DiagonalMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(1, 1);
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.False(rookPlayer1.IsPromoted);
Assert.Empty(steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player2Promoted_LateralMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(0, 5);
rookPlayer1.Promote();
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.True(rookPlayer1.IsPromoted);
Assert.Equal(5, steps.Count);
Assert.Contains(new Vector2(0, 1), steps);
Assert.Contains(new Vector2(0, 2), steps);
Assert.Contains(new Vector2(0, 3), steps);
Assert.Contains(new Vector2(0, 4), steps);
Assert.Contains(new Vector2(0, 5), steps);
}
[Fact]
public void GetStepsFromStartToEnd_Player2Promoted_DiagonalMove()
{
Vector2 start = new(0, 0);
Vector2 end = new(1, 1);
rookPlayer1.Promote();
var steps = rookPlayer1.GetPathFromStartToEnd(start, end).ToList();
Assert.True(rookPlayer1.IsPromoted);
Assert.Single(steps);
Assert.Contains(new Vector2(1, 1), steps);
}
}