Files
kompas3d-mcp/tests/Kompas.Mcp.Tests/OutputPathTests.cs
T
mikhail 31b933e1cc Ответ надписи — габарит глифов; запись на диск создаёт каталог
ksConvertTextToCurve ВОЗВРАЩАЕТ ссылку на кривые, и только по ней ksGetObjGabaritRect
даёт габарит букв: по текстовой ссылке это ячейка строки (Arial h=10 «HH» — 23.75 против
19.97 у глифов, второе совпадает с выдавленным телом). Агент вписывает надпись в поле
по габариту, поэтому в ответе теперь оба числа.

OutputPath.Prepare создаёт каталог назначения и делает путь абсолютным (document_save,
export_step, снимок): КОМПАС в несуществующую папку молча не пишет, а диагностика при
этом винила занятое имя файла — чинили не ту причину. Причины разведены.
2026-07-31 16:36:01 +03:00

66 lines
2.5 KiB
C#

using Kompas.Mcp.Core.Documents;
namespace Kompas.Mcp.Tests;
/// <summary>
/// Подготовка пути записи. КОМПАС в несуществующую папку молча не пишет, а инструмент рапортовал
/// «Сохранено» либо винил занятое имя файла — агент уходил чинить не ту причину.
/// </summary>
[Trait("Category", "Unit")]
public sealed class OutputPathTests : IDisposable
{
private readonly string _root = Path.Combine(Path.GetTempPath(), "kompas-mcp-tests", Guid.NewGuid().ToString("N")[..8]);
[Fact]
public void Missing_directory_is_created()
{
var path = Path.Combine(_root, "вложенная папка", "деталь.m3d");
var full = OutputPath.Prepare(path);
Assert.Equal(path, full);
Assert.True(Directory.Exists(Path.GetDirectoryName(full)), "каталог назначения не создан");
Assert.False(File.Exists(full), "сам файл создавать не нужно — его пишет КОМПАС");
}
[Fact]
public void Relative_path_becomes_absolute()
{
var full = OutputPath.Prepare("деталь.m3d");
Assert.True(Path.IsPathRooted(full), "относительный путь КОМПАС трактует от своего каталога");
}
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Empty_path_is_rejected(string? path)
=> Assert.Throws<ArgumentException>(() => OutputPath.Prepare(path));
[Fact]
public void Directory_without_a_file_name_is_rejected()
{
var ex = Assert.Throws<ArgumentException>(() => OutputPath.Prepare(_root + Path.DirectorySeparatorChar));
Assert.Contains("каталог", ex.Message, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void Existing_directory_is_left_alone()
{
Directory.CreateDirectory(_root);
var marker = Path.Combine(_root, "уже был.txt");
File.WriteAllText(marker, "x");
OutputPath.Prepare(Path.Combine(_root, "деталь.m3d"));
Assert.True(File.Exists(marker), "подготовка пути не должна трогать содержимое каталога");
}
public void Dispose()
{
try { if (Directory.Exists(_root)) Directory.Delete(_root, recursive: true); }
catch (IOException) { /* временный каталог подчистит система */ }
}
}