5272066bef
drawing_add_rough (знак шероховатости: ISymbols2DContainer.Roughs + IRoughParams, SignType ksRoughSignEnum, значение Ra/Rz через RoughParamText.Str), drawing_add_text (свободная надпись: IDrawingContainer.DrawingTexts + IText.Str), drawing_set_technical_requirements (блок тех. требований уровня документа: IDrawingDocument.TechnicalDemand.Text). - DrawingService: AddRoughAsync/AddTextAsync/SetTechnicalRequirementsAsync + ReadTechnicalRequirementsAsync + счётчики; RequireDrawingContainer/RequireTechnicalDemand - RoughSignType (enum + Parse/ToKompas), DrawingAnnotationResult (Value read-back из COM) - RequireNonEmptyText в DrawingValidation - 13 unit + 13 интеграционных тестов (всего 267 зелёных), сборка Release чистая Спайк подтвердил: значение шероховатости через IRoughParams.RoughParamText.Str (round-trip); текст НЕ в IView.ObjectCount (счёт по DrawingTexts.Count); тех. требования IsCreated False→True при первом Text.Str+Update, многострочно через \n. Ревью Codex спека учтено (height убран — это высота блока, не шрифт; guards; read-back возврат). Спек — docs/superpowers/specs/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
95 lines
3.5 KiB
C#
95 lines
3.5 KiB
C#
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<ArgumentException>(() => 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<ArgumentException>(() => 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<ArgumentOutOfRangeException>(() => 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)));
|
|
|
|
[Fact]
|
|
public void RequireFiniteCoords_throws_on_non_finite()
|
|
{
|
|
Assert.Throws<ArgumentException>(() => DrawingValidation.RequireFiniteCoords(0, double.NaN));
|
|
Assert.Throws<ArgumentException>(() => DrawingValidation.RequireFiniteCoords(double.PositiveInfinity));
|
|
Assert.Null(Record.Exception(() => DrawingValidation.RequireFiniteCoords(0, 1, -5, 40)));
|
|
}
|
|
|
|
[Fact]
|
|
public void RequireDistinctPoints_throws_on_coincident()
|
|
{
|
|
Assert.Throws<ArgumentException>(() => DrawingValidation.RequireDistinctPoints(10, 20, 10, 20));
|
|
Assert.Null(Record.Exception(() => DrawingValidation.RequireDistinctPoints(0, 0, 40, 0)));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(0)]
|
|
[InlineData(-5)]
|
|
[InlineData(double.NaN)]
|
|
[InlineData(double.PositiveInfinity)]
|
|
public void RequirePositiveRadius_throws_on_non_positive_or_non_finite(double radius)
|
|
=> Assert.Throws<ArgumentOutOfRangeException>(() => DrawingValidation.RequirePositiveRadius(radius));
|
|
|
|
[Fact]
|
|
public void RequirePositiveRadius_accepts_positive()
|
|
=> Assert.Null(Record.Exception(() => DrawingValidation.RequirePositiveRadius(15)));
|
|
|
|
[Theory]
|
|
[InlineData(null)]
|
|
[InlineData("")]
|
|
[InlineData(" ")]
|
|
public void RequireNonEmptyText_throws_on_empty(string? text)
|
|
=> Assert.Throws<ArgumentException>(() => DrawingValidation.RequireNonEmptyText(text, "text"));
|
|
|
|
[Fact]
|
|
public void RequireNonEmptyText_accepts_non_empty()
|
|
=> Assert.Null(Record.Exception(() => DrawingValidation.RequireNonEmptyText("Ra 1.6", "text")));
|
|
}
|