| 1 | using System.Text.Json; |
| 2 | using System.Text.Json.Nodes; |
| 3 | |
| 4 | namespace CascadeIDE.Tests; |
| 5 | |
| 6 | /// <summary> |
| 7 | /// Узкий детерминированный срез <c>get_cockpit_surface</c> для golden-сравнения (ADR 0052): |
| 8 | /// без <c>ui_mode</c>, строки <c>presentation</c>, вторичного shell и полей, зависящих от топологии презентации |
| 9 | /// и intent (колонки main, список инструментов) — они меняются с <c>display.screens.topology</c> и настройками. |
| 10 | /// </summary> |
| 11 | public static class AgentContractCockpitContractSlice |
| 12 | { |
| 13 | private static readonly JsonSerializerOptions Compact = new() { WriteIndented = false }; |
| 14 | |
| 15 | /// <summary> |
| 16 | /// Из полного JSON CDS оставляет <c>schema_version</c> и укороченный <c>topology</c> (без колонки MFD в main), |
| 17 | /// без <c>instruments</c> — форма элементов проверяется в тестах сериализации CDS. |
| 18 | /// </summary> |
| 19 | public static string ToStableSliceJson(string cockpitSurfaceJson) |
| 20 | { |
| 21 | var root = JsonNode.Parse(cockpitSurfaceJson)!.AsObject(); |
| 22 | var topo = root["topology"]?.AsObject(); |
| 23 | JsonObject? topoSlice = null; |
| 24 | if (topo is not null) |
| 25 | { |
| 26 | topoSlice = new JsonObject(); |
| 27 | foreach (var p in topo) |
| 28 | { |
| 29 | if (p.Key == "mfd_column_visible_in_main") |
| 30 | continue; |
| 31 | topoSlice[p.Key] = p.Value?.DeepClone(); |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | var slice = new JsonObject |
| 36 | { |
| 37 | ["schema_version"] = root["schema_version"]?.DeepClone(), |
| 38 | ["topology"] = topoSlice, |
| 39 | }; |
| 40 | |
| 41 | return slice.ToJsonString(Compact); |
| 42 | } |
| 43 | } |
| 44 | |