namespace Spectre.Console.Tests.Unit;

[ExpectationPath("Widgets/TextPath")]
public sealed class TextPathTests
{
    [Theory]
    [InlineData(8, "1234567890", "…4567890")]
    [InlineData(9, "1234567890", "…34567890")]
    public void Should_Use_Last_Segments_If_Less_Than_Three(int width, string input, string expected)
    {
        // Given
        var console = new TestConsole().Width(width);

        // When
        console.Write(new TextPath(input));

        // Then
        console.Output.ShouldBe(expected);
    }

    [Theory]
    [InlineData("C:/Foo/Bar/Baz.txt", "C:/Foo/Bar/Baz.txt")]
    [InlineData("/Foo/Bar/Baz.txt", "/Foo/Bar/Baz.txt")]
    [InlineData("Foo/Bar/Baz.txt", "Foo/Bar/Baz.txt")]
    public void Should_Render_Full_Path_If_Possible(string input, string expected)
    {
        // Given
        var console = new TestConsole().Width(40);

        // When
        console.Write(new TextPath(input));

        // Then
        console.Output.ShouldBe(expected);
    }

    [Theory]
    [InlineData(17, "C:/My documents/Bar/Baz.txt", "C:/…/Bar/Baz.txt")]
    [InlineData(15, "/My documents/Bar/Baz.txt", "/…/Bar/Baz.txt")]
    [InlineData(14, "My documents/Bar/Baz.txt", "…/Bar/Baz.txt")]
    public void Should_Pop_Segments_From_Left(int width, string input, string expected)
    {
        // Given
        var console = new TestConsole().Width(width);

        // When
        console.Write(new TextPath(input));

        // Then
        console.Output.ShouldBe(expected);
    }

    [Fact]
    public void Should_Right_Align_Correctly()
    {
        // Given
        var console = new TestConsole().Width(40);

        // When
        console.Write(new TextPath("C:/My documents/Bar/Baz.txt").RightJustified());

        // Then
        console.Output.ShouldBe("             C:/My documents/Bar/Baz.txt");
    }

    [Fact]
    public void Should_Center_Align_Correctly()
    {
        // Given
        var console = new TestConsole().Width(40);

        // When
        console.Write(new TextPath("C:/My documents/Bar/Baz.txt").Centered());

        // Then
        console.Output.ShouldBe("      C:/My documents/Bar/Baz.txt       ");
    }

    [Fact]
    [Expectation("GH-1307")]
    [GitHubIssue("https://github.com/spectreconsole/spectre.console/issues/1307")]
    public Task Should_Behave_As_Expected_When_Rendering_Inside_Panel_Columns()
    {
        // Given
        var console = new TestConsole().Width(40);

        // When
        console.Write(
            new Columns(
                new Panel(new Text("Baz")),
                new Panel(new TextPath("Qux"))));

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