using Spectre.Console.Extensions;

namespace Spectre.Console.Tests.Unit;

[UsesVerify]
[ExpectationPath("Widgets/Align")]
public sealed class AlignTests
{
    [UsesVerify]
    public sealed class Left
    {
        [Fact]
        [Expectation("Left_Top")]
        public Task Should_Render_Panel_Left_Aligned_At_Top()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Left(new Panel("Hello World!"), VerticalAlignment.Top).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }

        [Fact]
        [Expectation("Left_Middle")]
        public Task Should_Render_Panel_Left_Aligned_At_Middle()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Left(new Panel("Hello World!"), VerticalAlignment.Middle).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }

        [Fact]
        [Expectation("Left_Bottom")]
        public Task Should_Render_Panel_Left_Aligned_At_Bottom()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Left(new Panel("Hello World!"), VerticalAlignment.Bottom).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }
    }

    [UsesVerify]
    public sealed class Center
    {
        [Fact]
        [Expectation("Center_Top")]
        public Task Should_Render_Panel_Center_Aligned_At_Top()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Center(new Panel("Hello World!"), VerticalAlignment.Top).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }

        [Fact]
        [Expectation("Center_Middle")]
        public Task Should_Render_Panel_Center_Aligned_At_Middle()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Center(new Panel("Hello World!"), VerticalAlignment.Middle).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }

        [Fact]
        [Expectation("Center_Bottom")]
        public Task Should_Render_Panel_Center_Aligned_At_Bottom()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Center(new Panel("Hello World!"), VerticalAlignment.Bottom).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }
    }

    [UsesVerify]
    public sealed class Right
    {
        [Fact]
        [Expectation("Right_Top")]
        public Task Should_Render_Panel_Right_Aligned_At_Top()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Right(new Panel("Hello World!"), VerticalAlignment.Top).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }

        [Fact]
        [Expectation("Right_Middle")]
        public Task Should_Render_Panel_Right_Aligned_At_Middle()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Right(new Panel("Hello World!"), VerticalAlignment.Middle).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }

        [Fact]
        [Expectation("Right_Bottom")]
        public Task Should_Render_Panel_Right_Aligned_At_Bottom()
        {
            // Given
            var console = new TestConsole().Size(new Size(40, 15));
            var align = Align.Right(new Panel("Hello World!"), VerticalAlignment.Bottom).Height(15);

            // When
            console.Write(align);

            // Then
            return Verifier.Verify(console.Output);
        }
    }
}