feat: assembly_add_mate — упрочнение по ревью Codex реализации

#1: Valid==false → ошибка (откат), а не «успех с valid=false»; косвенно отсекает
грани одного компонента (вырожденный мат). #6/#7: distance value строго > 0
(нулевой зазор = coincidence) + unit-кейс value=0 бросает. #8: негативный
интеграционный тест — точка в пустоте → грань не найдена → ошибка.
#2/#3/#4 оставлены по обоснованию (best-effort откол, Add??throw, первый IFace —
консистентно с HoleService). #9 точечный release RCW отклонён (конвенция v2-2).

Тесты: 98 unit + 58 integration = 156 зелёных.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 13:45:35 +03:00
parent 8282716773
commit 3fe06f61dc
5 changed files with 39 additions and 6 deletions
@@ -123,8 +123,12 @@ public sealed class AssemblyService
"Update сопряжения вернул FALSE — связь не наложена (несовместимые грани/значение?).");
if (!top.RebuildModel(true))
throw new InvalidOperationException("RebuildModel вернул FALSE — сборка не перестроена после сопряжения.");
if (!mate.Valid)
throw new InvalidOperationException(
"Сопряжение построено, но вырождено (Valid=false) — вероятно, грани несовместимы " +
"или принадлежат одному компоненту. Проверьте выбор граней.");
return new AddedMate { Type = type, Valid = mate.Valid };
return new AddedMate { Type = type, Valid = true };
}
catch
{
@@ -38,13 +38,15 @@ public static class AssemblyValidation
/// <summary>
/// Проверить числовое значение сопряжения. Если значение требуется (<paramref name="requiresValue"/>,
/// напр. расстояние) — оно должно быть конечным и неотрицательным.
/// напр. расстояние) — оно должно быть конечным и строго положительным (зазор 0 вырождается в
/// совпадение — для него есть отдельный тип).
/// </summary>
public static void RequireMateValue(bool requiresValue, double value)
{
if (!requiresValue) return; // для типов без параметра значение игнорируется
if (!double.IsFinite(value) || value < 0)
if (!double.IsFinite(value) || value <= 0)
throw new ArgumentOutOfRangeException(nameof(value),
"Значение сопряжения (расстояние) должно быть конечным и неотрицательным.");
"Значение сопряжения (расстояние) должно быть конечным и > 0 " +
"(для нулевого зазора используйте тип coincidence).");
}
}