using Kompas.Mcp.Core.Documents;
using Kompas.Mcp.Core.Drawings;
namespace Kompas.Mcp.Tests.Integration;
/// Интеграция: формат и ориентация листа чертежа (API7 ILayoutSheet.Format / ISheetFormat).
[Trait("Category", "Integration")]
[Collection(KompasCollection.Name)]
public sealed class DrawingSheetFormatTests : IntegrationTestBase
{
private readonly DocumentService _docs;
private readonly DrawingService _drawing;
public DrawingSheetFormatTests(KompasFixture fx) : base(fx)
{
_docs = new DocumentService(fx.Session, fx.Dispatcher);
_drawing = new DrawingService(fx.Session, fx.Dispatcher);
}
[Fact]
public async Task A3_landscape()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
var r = await _drawing.SetSheetFormatAsync(PaperFormat.A3, landscape: true, width: 0, height: 0);
Assert.Equal("A3", r.Format);
Assert.InRange(r.Width, 419.5, 420.5);
Assert.InRange(r.Height, 296.5, 297.5);
Assert.True(r.Landscape);
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task A4_portrait()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
var r = await _drawing.SetSheetFormatAsync(PaperFormat.A4, landscape: false, width: 0, height: 0);
Assert.Equal("A4", r.Format);
Assert.InRange(r.Width, 209.5, 210.5);
Assert.InRange(r.Height, 296.5, 297.5);
Assert.False(r.Landscape);
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task A4_landscape_swaps_dimensions()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
var r = await _drawing.SetSheetFormatAsync(PaperFormat.A4, landscape: true, width: 0, height: 0);
Assert.Equal("A4", r.Format);
Assert.InRange(r.Width, 296.5, 297.5); // своп: альбомная A4 = 297×210
Assert.InRange(r.Height, 209.5, 210.5);
Assert.True(r.Landscape);
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task User_landscape_dimensions_derive_orientation()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
// 500×300 (W>H) → КОМПАС выводит альбомную ориентацию (Landscape=true), W/H литеральны.
var r = await _drawing.SetSheetFormatAsync(PaperFormat.User, landscape: false, width: 500, height: 300);
Assert.Equal("User", r.Format);
Assert.InRange(r.Width, 499.5, 500.5);
Assert.InRange(r.Height, 299.5, 300.5);
Assert.True(r.Landscape); // ориентация выведена из соотношения сторон (не из флага landscape=false)
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task User_portrait_dimensions_derive_orientation()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
// 300×500 (H>W) → книжная (Landscape=false).
var r = await _drawing.SetSheetFormatAsync(PaperFormat.User, landscape: true, width: 300, height: 500);
Assert.Equal("User", r.Format);
Assert.InRange(r.Width, 299.5, 300.5);
Assert.InRange(r.Height, 499.5, 500.5);
Assert.False(r.Landscape); // landscape=true проигнорирован — ориентация из сторон
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task User_without_dimensions_throws()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
await Assert.ThrowsAsync(() =>
_drawing.SetSheetFormatAsync(PaperFormat.User, landscape: false, width: 0, height: 0));
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Standard_with_dimensions_throws()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
await Assert.ThrowsAsync(() =>
_drawing.SetSheetFormatAsync(PaperFormat.A3, landscape: false, width: 400, height: 0));
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Nonexistent_sheet_throws()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
await Assert.ThrowsAsync(() =>
_drawing.SetSheetFormatAsync(PaperFormat.A4, landscape: false, width: 0, height: 0, sheetNumber: 99));
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Nonpositive_sheet_number_throws()
{
await _docs.CreateAsync(KompasDocumentType.Drawing);
try
{
await Assert.ThrowsAsync(() =>
_drawing.SetSheetFormatAsync(PaperFormat.A4, landscape: false, width: 0, height: 0, sheetNumber: 0));
}
finally { await _docs.CloseAsync(save: false); }
}
[Fact]
public async Task Active_document_not_drawing_throws()
{
await _docs.CreateAsync(KompasDocumentType.Part);
try
{
await Assert.ThrowsAsync(() =>
_drawing.SetSheetFormatAsync(PaperFormat.A4, landscape: false, width: 0, height: 0));
}
finally { await _docs.CloseAsync(save: false); }
}
}