using AcDream.Core.Chat; using AcDream.UI.Abstractions.Panels.SpewBox; namespace AcDream.UI.Abstractions.Tests.Panels.SpewBox; public sealed class SpewBoxVMTests { [Fact] public void Lines_NoContent_ReturnsEmpty() { var vm = new SpewBoxVM(new SpewBoxState()); Assert.Empty(vm.Lines(0d)); Assert.False(vm.HasVisibleLines); } [Fact] public void Lines_DrainsPendingAndReturnsRemainingLifetime() { var state = new SpewBoxState(); var vm = new SpewBoxVM(state); state.Enqueue("You can't jump while in the air"); IReadOnlyList lines = vm.Lines(nowSeconds: 10d); SpewBoxLine line = Assert.Single(lines); Assert.Equal("You can't jump while in the air", line.Text); Assert.Equal(SpewBoxState.DefaultLifetime.TotalSeconds, line.RemainingLifetimeSeconds, precision: 3); Assert.True(vm.HasVisibleLines); } [Fact] public void Lines_RemainingLifetime_CountsDownAndFloorsAtZero() { var state = new SpewBoxState(); var vm = new SpewBoxVM(state); state.Enqueue("fading"); vm.Lines(nowSeconds: 0d); double halfway = SpewBoxState.DefaultLifetime.TotalSeconds / 2; SpewBoxLine midLine = Assert.Single(vm.Lines(nowSeconds: halfway)); Assert.Equal(halfway, midLine.RemainingLifetimeSeconds, precision: 3); // Past expiry: the line is pruned by the same Lines() call that ticks it. Assert.Empty(vm.Lines(nowSeconds: SpewBoxState.DefaultLifetime.TotalSeconds + 1d)); } [Fact] public void Lines_NewestFirst_MatchesRetailInsertAtZero() { // CH2 REJECT-review rework NIT 3: MaxConcurrentItems is the // AUTHORED LayoutDesc value (4, see SpewBoxState.MaxConcurrentItems's // own doc comment), not retail's code default (1) — both entries // now survive, so assert the ordering directly. var state = new SpewBoxState(); var vm = new SpewBoxVM(state); state.Enqueue("older"); vm.Lines(0d); state.Enqueue("newer"); IReadOnlyList lines = vm.Lines(0d); Assert.Equal(2, lines.Count); Assert.Equal("newer", lines[0].Text); Assert.Equal("older", lines[1].Text); } [Fact] public void Revision_TracksUnderlyingState() { var state = new SpewBoxState(); var vm = new SpewBoxVM(state); long initial = vm.Revision; state.Enqueue("a line"); vm.Lines(0d); Assert.True(vm.Revision > initial); Assert.Equal(state.Revision, vm.Revision); } }