using AcDream.App.UI; using AcDream.App.UI.Layout; using AcDream.Core.Chat; using AcDream.UI.Abstractions; using AcDream.UI.Abstractions.Panels.Chat; namespace AcDream.App.Tests.UI.Layout; /// /// Dat-free conformance tests for the committed chat_21000006.json golden fixture. /// Verifies that LayoutImporter.ImportInfos correctly resolves the BaseElement / /// BaseLayoutId inheritance chain for the chat window (LayoutDesc 0x21000006). /// public class ChatLayoutConformanceTests { private static (uint, int, int) NoTex(uint _) => (0, 0, 0); private static ElementInfo? Find(ElementInfo n, uint id) { if (n.Id == id) return n; foreach (var c in n.Children) { var f = Find(c, id); if (f is not null) return f; } return null; } [Fact] public void ChatFixture_ResolvesKnownElements() { var root = FixtureLoader.LoadChatInfos(); Assert.NotNull(Find(root, 0x10000011u)); // transcript Assert.NotNull(Find(root, 0x10000016u)); // input Assert.NotNull(Find(root, 0x10000012u)); // scrollbar track Assert.NotNull(Find(root, 0x10000014u)); // channel menu Assert.NotNull(Find(root, 0x10000019u)); // send button Assert.NotNull(Find(root, 0x1000046Fu)); // max/min button } [Fact] public void ChatFixture_ResolvedTypes_MatchRetailRegistry() { var root = FixtureLoader.LoadChatInfos(); Assert.Equal(6u, Find(root, 0x10000014u)!.Type); // Menu Assert.Equal(11u, Find(root, 0x10000012u)!.Type); // Scrollbar Assert.Equal(1u, Find(root, 0x10000019u)!.Type); // Button (Send) Assert.Equal(1u, Find(root, 0x1000046Fu)!.Type); // Button (Max/Min) Assert.Equal(12u, Find(root, 0x10000011u)!.Type); // Text/style-prototype (transcript) Assert.Equal(12u, Find(root, 0x10000016u)!.Type); // Text/style-prototype (input) } [Fact] public void ChatFixture_BuildsSelectableTranscriptAndEditableInputInPlace() { var layout = FixtureLoader.LoadChat(); var transcript = Assert.IsType(layout.FindElement(0x10000011u)); var input = Assert.IsType(layout.FindElement(0x10000016u)); Assert.True(transcript.Selectable); Assert.True(input.Selectable); Assert.True(input.OneLine); Assert.Equal(0x10000016u, input.DatElementId); } [Fact] public void ChatFixture_CroppedDockedRoot_ReflowsContentAcrossMountedWidth() { var infos = FixtureLoader.LoadChatInfos(); var layout = LayoutImporter.Build(infos, NoTex, null); var controller = ChatWindowController.Bind( infos, layout, new ChatVM(new ChatLog()), () => NullCommandBus.Instance, null, null, NoTex); Assert.NotNull(controller); var root = controller!.Root; root.Width = 490; root.Height = 100; root.RebaseChildLayoutBaselines(); root.Width = 615; var transcriptPanel = layout.FindElement(0x10000010u)!; var inputBar = layout.FindElement(0x10000013u)!; transcriptPanel.ApplyAnchor(root.Width, root.Height); inputBar.ApplyAnchor(root.Width, root.Height); Assert.Equal(615f, transcriptPanel.Width); Assert.Equal(615f, inputBar.Width); } [Fact] public void ChatFixture_ChannelCaptionWidth_SurvivesImportedLayoutPass() { var infos = FixtureLoader.LoadChatInfos(); var layout = LayoutImporter.Build(infos, NoTex, null); var controller = ChatWindowController.Bind( infos, layout, new ChatVM(new ChatLog()), () => NullCommandBus.Instance, null, null, NoTex); Assert.NotNull(controller); controller!.Menu.OnSelect!.Invoke(ChatChannelKind.General); float fittedWidth = controller.Menu.Width; controller.Menu.ApplyAnchor(controller.Menu.Parent!.Width, controller.Menu.Parent.Height); Assert.True(fittedWidth > 46f); Assert.Equal(fittedWidth, controller.Menu.Width); Assert.Equal(controller.Menu.Left + fittedWidth, controller.Input.Left); } }