using Kompas.Mcp.Core.Modeling;

namespace Kompas.Mcp.Tests;

/// <summary>
/// Разбор списка точек: рёбра выбираются пакетом, чтобы N углов давали ОДНУ операцию в дереве.
/// Ошибка обязана называть позицию в пакете — иначе агент гадает, какая из точек кривая.
/// </summary>
[Trait("Category", "Unit")]
public sealed class Point3dInputsTests
{
    [Fact]
    public void Points_are_parsed_in_order()
    {
        var parsed = Point3dInputs.Parse(
        [
            new Point3dInput { X = 1, Y = 2, Z = 3 },
            new Point3dInput { X = 4, Y = 5, Z = 6 },
        ]);

        Assert.Equal(new Point3d(1, 2, 3), parsed[0]);
        Assert.Equal(new Point3d(4, 5, 6), parsed[1]);
    }

    [Fact]
    public void Absent_list_is_not_an_error_but_an_empty_result()
    {
        Assert.Empty(Point3dInputs.Parse(null));
        Assert.Empty(Point3dInputs.Parse([]));
    }

    [Fact]
    public void Non_finite_coordinate_names_its_position()
    {
        var ex = Assert.Throws<ArgumentException>(() => Point3dInputs.Parse(
        [
            new Point3dInput { X = 0, Y = 0, Z = 0 },
            new Point3dInput { X = double.NaN, Y = 0, Z = 0 },
        ]));

        Assert.Contains("[1]", ex.Message, StringComparison.Ordinal);
    }
}
