Files
kompas3d-mcp/tests/Kompas.Mcp.Tests/PrimitivesTests.cs
T
mikhail a4cc755fb4 Формообразование: надписи в эскизе, тонкая стенка, тела по размерам
Три способа получить форму там, где раньше был только замкнутый контур
из отрезков и дуг.

1. Примитив эскиза type=text: ksTextEx + ksConvertTextToCurve. Пока текст
   остаётся текстом, это оформление, и операция его не видит; после
   конвертации глифы становятся обычным сечением. Ответ возвращает
   фактическую длину строки — иначе ширину шрифта до выдавливания не узнать.

2. extrude(thinThickness, thinSide): контур трактуется как стенка заданной
   толщины. outward по замкнутому контуру даёт кайму-эквидистанту вокруг
   него — так надпись получает подложку без 2D-эквидистанты.
   Толщину при dtReverse КОМПАС читает из reverseThickness: положить её в
   normalThickness значит молча получить СПЛОШНОЕ сечение вместо рамки.

3. Инструмент primitive: элементарные тела API7 (block, cylinder, sphere,
   cone) с result=new|union|subtract|intersect. Карман и паз строятся
   вычитанием тела, без эскиза и выреза. Update() возвращает TRUE даже
   когда вычитание прошло мимо тела, поэтому сервис сверяет объём до и
   после и откатывает операцию, если ничего не изменилось.
2026-07-31 14:50:56 +03:00

78 lines
3.2 KiB
C#

using Kompas.Mcp.Core.Modeling;
namespace Kompas.Mcp.Tests;
/// <summary>
/// Разбор и валидация примитивов. У слитого инструмента схема не запрещает лишние поля,
/// поэтому недостающий размер обязана назвать валидация — вместе с типом тела.
/// </summary>
[Trait("Category", "Unit")]
public sealed class PrimitivesTests
{
[Theory]
[InlineData("block", PrimitiveKind.Block)]
[InlineData(" BOX ", PrimitiveKind.Block)]
[InlineData("cylinder", PrimitiveKind.Cylinder)]
[InlineData("sphere", PrimitiveKind.Sphere)]
[InlineData("cone", PrimitiveKind.Cone)]
public void Kind_names_and_aliases_are_recognized(string value, PrimitiveKind expected)
=> Assert.Equal(expected, Primitives.ParseKind(value));
[Theory]
[InlineData("", PrimitiveResult.NewBody)]
[InlineData("new", PrimitiveResult.NewBody)]
[InlineData("union", PrimitiveResult.Union)]
[InlineData("subtract", PrimitiveResult.Subtract)]
[InlineData("cut", PrimitiveResult.Subtract)]
[InlineData("intersect", PrimitiveResult.Intersect)]
public void Result_names_and_aliases_are_recognized(string value, PrimitiveResult expected)
=> Assert.Equal(expected, Primitives.ParseResult(value));
[Fact]
public void Unknown_kind_lists_the_allowed_ones()
{
var ex = Assert.Throws<ArgumentException>(() => Primitives.ParseKind("torus"));
Assert.Contains("torus", ex.Message, StringComparison.Ordinal);
Assert.Contains("cylinder", ex.Message, StringComparison.Ordinal);
}
[Fact]
public void Block_names_the_missing_dimension()
{
var ex = Assert.Throws<ArgumentException>(
() => Primitives.Validate(PrimitiveKind.Block, length: 10, width: null, height: 5, diameter: null));
Assert.Contains("block", ex.Message, StringComparison.Ordinal);
Assert.Contains("width", ex.Message, StringComparison.Ordinal);
}
[Fact]
public void Cylinder_needs_diameter_and_height_not_length()
{
var ex = Assert.Throws<ArgumentException>(
() => Primitives.Validate(PrimitiveKind.Cylinder, length: 10, width: 10, height: 5, diameter: null));
Assert.Contains("diameter", ex.Message, StringComparison.Ordinal);
}
[Fact]
public void Sphere_needs_only_the_diameter()
{
Primitives.Validate(PrimitiveKind.Sphere, length: null, width: null, height: null, diameter: 12);
}
[Fact]
public void Non_positive_size_is_rejected_with_the_value()
{
var ex = Assert.Throws<ArgumentException>(
() => Primitives.Validate(PrimitiveKind.Block, length: 10, width: 0, height: 5, diameter: null));
Assert.Contains("width", ex.Message, StringComparison.Ordinal);
Assert.Contains("> 0", ex.Message, StringComparison.Ordinal);
}
// Маппинг в COM-перечисления (ksObj3dTypeEnum / ksOperationResultEnum) проверяется
// интеграционно — сборки КОМПАС в тестовом проекте недоступны без установленного CAD.
}