using Kompas.Mcp.Core.Drawings; namespace Kompas.Mcp.Tests; [Trait("Category", "Unit")] public sealed class DrawingValidationTests { [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] public void NormalizeModelPath_throws_on_empty(string? path) => Assert.Throws(() => DrawingValidation.NormalizeModelPath(path)); [Theory] [InlineData(@"C:\m\part.step")] [InlineData(@"C:\m\part.txt")] [InlineData(@"C:\m\part")] public void NormalizeModelPath_throws_on_wrong_extension(string path) => Assert.Throws(() => DrawingValidation.NormalizeModelPath(path)); [Theory] [InlineData(@"C:\m\part.m3d", ".m3d")] [InlineData(@"C:\m\frame.a3d", ".a3d")] [InlineData(@" C:\m\part.M3D ", ".m3d")] [InlineData(@"C:\модели\деталь.m3d", ".m3d")] // кириллица в пути public void NormalizeModelPath_accepts_model_files(string path, string expectedExt) { var result = DrawingValidation.NormalizeModelPath(path); Assert.True(Path.IsPathFullyQualified(result)); Assert.EndsWith(expectedExt, result, StringComparison.OrdinalIgnoreCase); } [Fact] public void NormalizeModelPath_preserves_cyrillic() { var result = DrawingValidation.NormalizeModelPath(@"C:\модели\деталь.m3d"); Assert.Contains("деталь", result); Assert.Contains("модели", result); } [Theory] [InlineData(0)] [InlineData(-1)] [InlineData(double.NaN)] [InlineData(double.PositiveInfinity)] public void RequireScale_throws_on_non_positive_or_non_finite(double scale) => Assert.Throws(() => DrawingValidation.RequireScale(scale)); [Theory] [InlineData(1.0)] [InlineData(0.5)] [InlineData(2.0)] public void RequireScale_accepts_positive(double scale) => Assert.Null(Record.Exception(() => DrawingValidation.RequireScale(scale))); }