| 1 | using System.Text.Json; |
| 2 | using Avalonia.Headless.XUnit; |
| 3 | using CascadeIDE.Cockpit.Cds; |
| 4 | using CascadeIDE.Services; |
| 5 | using CascadeIDE.ViewModels; |
| 6 | using Xunit; |
| 7 | |
| 8 | namespace CascadeIDE.Tests; |
| 9 | |
| 10 | /// <summary> |
| 11 | /// Паритет MCP <c>ide_get_ide_state</c> с CDS: поле <c>cockpit_surface</c> совпадает с <see cref="MainWindowViewModel.BuildCockpitSurfaceSnapshot"/>. |
| 12 | /// Требует headless Avalonia (<see cref="AvaloniaFact"/>), т.к. <see cref="IIdeMcpActions.GetIdeStateAsync"/> маршалит на UI-поток. |
| 13 | /// </summary> |
| 14 | public sealed class IdeMcpIdeStateCdsIntegrationTests |
| 15 | { |
| 16 | [AvaloniaFact] |
| 17 | public async Task Get_ide_state_cockpit_surface_matches_BuildCockpitSurfaceSnapshot() |
| 18 | { |
| 19 | var vm = new MainWindowViewModel(); |
| 20 | IIdeMcpActions mcp = vm.IdeMcp; |
| 21 | |
| 22 | var json = await mcp.GetIdeStateAsync(); |
| 23 | |
| 24 | using var doc = JsonDocument.Parse(json); |
| 25 | Assert.True(doc.RootElement.TryGetProperty("cockpit_surface", out var cockpitEl)); |
| 26 | |
| 27 | var expectedJson = JsonSerializer.Serialize(vm.BuildCockpitSurfaceSnapshot()); |
| 28 | Assert.Equal(expectedJson, cockpitEl.GetRawText()); |
| 29 | |
| 30 | var fromWorkspace = JsonSerializer.Deserialize<CockpitSurfaceState>(cockpitEl.GetRawText()); |
| 31 | var direct = vm.BuildCockpitSurfaceSnapshot(); |
| 32 | Assert.NotNull(fromWorkspace); |
| 33 | Assert.Equal(direct.SchemaVersion, fromWorkspace!.SchemaVersion); |
| 34 | Assert.Equal(direct.Topology.SurfaceKind, fromWorkspace.Topology.SurfaceKind); |
| 35 | Assert.Equal(direct.Instruments.Count, fromWorkspace.Instruments.Count); |
| 36 | } |
| 37 | } |
| 38 | |