using AcDream.App.UI; using Xunit; namespace AcDream.App.Tests.UI; public class UiFieldTests { [Fact] public void InsertChar_AdvancesCaret() { var input = new UiField(); input.InsertChar('h'); input.InsertChar('i'); Assert.Equal("hi", input.Text); Assert.Equal(2, input.CaretPos); } [Fact] public void Backspace_DeletesBeforeCaret() { var input = new UiField(); 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 UiField { 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 UiField { OnSubmit = _ => n++ }; input.Submit(); Assert.Equal(0, n); } [Fact] public void History_UpDownBrowsesPreviousSubmissions() { var input = new UiField { 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 UiField { OnSubmit = _ => {} }; for (int i = 0; i < 150; i++) { input.InsertChar('x'); input.Submit(); } Assert.True(input.HistoryCount <= 100); } [Fact] public void CharacterFilter_rejectsDisallowedInput() { var input = new UiField { CharacterFilter = static c => char.IsAsciiDigit(c) }; input.InsertChar('4'); input.InsertChar('x'); input.InsertChar('2'); Assert.Equal("42", input.Text); } [Fact] public void SelectAllOnFocus_survivesInitiatingMouseDown_andTypingReplacesValue() { var input = new UiField { SelectAllOnFocus = true, Selectable = true }; input.SetText("17"); input.OnEvent(new UiEvent(0u, input, UiEventType.FocusGained)); input.OnEvent(new UiEvent(0u, input, UiEventType.MouseDown, Data1: 2)); input.InsertChar('5'); Assert.Equal("5", input.Text); } }