using AcDream.App.UI; using Xunit; namespace AcDream.App.Tests.UI; /// /// Pure unit tests for — no GL dependency. /// public class UiScrollbarTests { // Model: content=400, view=100, trackLen=200. // ThumbRatio = 100/400 = 0.25 → thumbH = max(8, 200*0.25) = 50. // Travel = 200 - 50 = 150. [Fact] public void ThumbRect_AtStart_HasCorrectSizeAndZeroOffset() { var m = new UiScrollable { ContentHeight = 400, ViewHeight = 100 }; // PositionRatio = 0 (start). var (y, h) = UiScrollbar.ThumbRect(m, trackTop: 0f, trackLen: 200f); Assert.Equal(50f, h, 3f); Assert.Equal(0f, y, 3f); } [Fact] public void ThumbRect_AtEnd_PinsToBottomOfTrack() { var m = new UiScrollable { ContentHeight = 400, ViewHeight = 100 }; m.ScrollToEnd(); // PositionRatio = 1. float trackTop = 16f, trackLen = 200f; var (y, h) = UiScrollbar.ThumbRect(m, trackTop, trackLen); Assert.Equal(50f, h, 3f); // y = trackTop + travel * 1 = 16 + 150 = 166. Assert.Equal(166f, y, 3f); } [Fact] public void ThumbRect_WithButtonH_CorrectlyOffsetsFromTrackTop() { // Matches task spec: content=400, view=100, trackLen=200, PositionRatio=1. // thumbH=50; travel=150; y = trackTop + 150 = trackTop + 150. var m = new UiScrollable { ContentHeight = 400, ViewHeight = 100 }; m.ScrollToEnd(); var (y, h) = UiScrollbar.ThumbRect(m, trackTop: 16f, trackLen: 200f); Assert.Equal(50f, h, 3f); Assert.Equal(166f, y, 3f); // 16 + 150 } [Fact] public void ThumbRect_MidScroll_InterpolatesPosition() { // content=400 view=100 → MaxScroll=300; ScrollY=150 → PositionRatio=0.5. var m = new UiScrollable { ContentHeight = 400, ViewHeight = 100 }; m.SetScrollY(150); Assert.Equal(0.5f, m.PositionRatio, 3); var (y, h) = UiScrollbar.ThumbRect(m, trackTop: 0f, trackLen: 200f); Assert.Equal(50f, h, 3f); // y = 0 + 150 * 0.5 = 75. Assert.Equal(75f, y, 3f); } [Fact] public void ThumbRect_SmallContent_EnforcesMinThumb() { // content=1000, view=10, trackLen=200 → ThumbRatio=0.01 → raw=2 < 8 → clamp to 8. var m = new UiScrollable { ContentHeight = 1000, ViewHeight = 10 }; var (_, h) = UiScrollbar.ThumbRect(m, trackTop: 0f, trackLen: 200f); Assert.Equal(8f, h, 3f); } [Fact] public void ThumbRect_NoOverflow_ThumbFillsTrack() { // content <= view → ThumbRatio = 1 → thumbH = trackLen. var m = new UiScrollable { ContentHeight = 50, ViewHeight = 100 }; var (y, h) = UiScrollbar.ThumbRect(m, trackTop: 16f, trackLen: 100f); Assert.Equal(100f, h, 3f); Assert.Equal(16f, y, 3f); // travel = 0 → y = trackTop } }