using Kompas.Mcp.Core.Modeling;

namespace Kompas.Mcp.Tests;

/// <summary>
/// Имя операции в дереве построения. Дерево из «Эскиз:1…Эскиз:5» нечитаемо, поэтому имя
/// принимается у каждой операции — но кривое имя (с переводом строки, гигантское) в дереве
/// отображается искажённо, и лучше сказать об этом сразу.
/// </summary>
[Trait("Category", "Unit")]
public sealed class FeatureNameTests
{
    [Fact]
    public void Name_is_trimmed()
        => Assert.Equal("Контур плашки", FeatureName.Normalize("  Контур плашки  "));

    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void Empty_name_means_leave_the_kompas_default(string? name)
        => Assert.Null(FeatureName.Normalize(name));

    [Fact]
    public void Too_long_name_is_rejected_with_the_limit_in_the_message()
    {
        var ex = Assert.Throws<ArgumentException>(() => FeatureName.Normalize(new string('я', FeatureName.MaxLength + 1)));
        Assert.Contains(FeatureName.MaxLength.ToString(), ex.Message, StringComparison.Ordinal);
    }

    [Fact]
    public void Name_at_the_limit_is_accepted()
    {
        var name = new string('я', FeatureName.MaxLength);
        Assert.Equal(name, FeatureName.Normalize(name));
    }

    [Theory]
    [InlineData("Эскиз\nвторая строка")]
    [InlineData("Эскиз\tтабуляция")]
    public void Control_characters_are_rejected(string name)
        => Assert.Throws<ArgumentException>(() => FeatureName.Normalize(name));

    [Fact]
    public void Parameter_name_reaches_the_message()
    {
        var ex = Assert.Throws<ArgumentException>(() => FeatureName.Normalize("a\nb", "sketchName"));
        Assert.Equal("sketchName", ex.ParamName);
    }
}
