using AcDream.App.UI; using Xunit; namespace AcDream.App.Tests.UI; public class UiChatInputTests { [Fact] public void InsertChar_AdvancesCaret() { var input = new UiChatInput(); input.InsertChar('h'); input.InsertChar('i'); Assert.Equal("hi", input.Text); Assert.Equal(2, input.CaretPos); } [Fact] public void Backspace_DeletesBeforeCaret() { var input = new UiChatInput(); foreach (var c in "abc") input.InsertChar(c); input.MoveCaret(-1); input.Backspace(); Assert.Equal("ac", input.Text); Assert.Equal(1, input.CaretPos); } [Fact] public void Submit_FiresCallback_ClearsText_PushesHistory() { string? sent = null; var input = new UiChatInput { OnSubmit = t => sent = t }; foreach (var c in "hello") input.InsertChar(c); input.Submit(); Assert.Equal("hello", sent); Assert.Equal("", input.Text); Assert.Equal(0, input.CaretPos); } [Fact] public void EmptySubmit_DoesNotFire() { int n = 0; var input = new UiChatInput { OnSubmit = _ => n++ }; input.Submit(); Assert.Equal(0, n); } [Fact] public void History_UpDownBrowsesPreviousSubmissions() { var input = new UiChatInput { OnSubmit = _ => {} }; foreach (var c in "first") input.InsertChar(c); input.Submit(); foreach (var c in "second") input.InsertChar(c); input.Submit(); input.HistoryPrev(); Assert.Equal("second", input.Text); input.HistoryPrev(); Assert.Equal("first", input.Text); input.HistoryNext(); Assert.Equal("second", input.Text); input.HistoryNext(); Assert.Equal("", input.Text); } [Fact] public void History_CapsAt100() { var input = new UiChatInput { OnSubmit = _ => {} }; for (int i = 0; i < 150; i++) { input.InsertChar('x'); input.Submit(); } Assert.True(input.HistoryCount <= 100); } }