using Paca.Browser; namespace Paca.Tests.Browser; // T1-3 페이지 내 검색: FindSession 은 네이티브 Find API(IFindApi) 위의 상태 머신. public class FindSessionTests { private sealed class FakeFindApi : IFindApi { public string? LastTerm; public int StartCount, NextCount, PrevCount, StopCount; public int MatchCount { get; set; } public int ActiveIndex { get; set; } public event EventHandler? MatchCountChanged; public event EventHandler? ActiveMatchIndexChanged; public Task StartAsync(string term, bool caseSensitive, bool matchWord, bool highlightAll) { StartCount++; LastTerm = term; return Task.CompletedTask; } public void FindNext() => NextCount++; public void FindPrevious() => PrevCount++; public void Stop() => StopCount++; public void RaiseCount(int n) { MatchCount = n; MatchCountChanged?.Invoke(this, n); } public void RaiseActive(int n) { ActiveIndex = n; ActiveMatchIndexChanged?.Invoke(this, n); } } [Fact] public async Task Start는_API로_용어를_전달하고_카운트_이벤트를_구독_반영한다() { var api = new FakeFindApi(); var session = new FindSession(api); await session.StartAsync("hello"); api.RaiseCount(7); Assert.Equal(1, api.StartCount); Assert.Equal("hello", api.LastTerm); Assert.Equal(7, session.MatchCount); } [Fact] public async Task Next_Previous는_API에_위임한다() { var api = new FakeFindApi(); var session = new FindSession(api); await session.StartAsync("x"); session.Next(); session.Previous(); Assert.Equal(1, api.NextCount); Assert.Equal(1, api.PrevCount); } [Fact] public async Task ActiveMatchIndex_이벤트가_상태에_반영된다() { var api = new FakeFindApi(); var session = new FindSession(api); await session.StartAsync("x"); api.RaiseActive(3); Assert.Equal(3, session.ActiveMatchIndex); } [Fact] public async Task 빈_용어로_Start하면_Stop만_호출된다() { var api = new FakeFindApi(); var session = new FindSession(api); await session.StartAsync(" "); Assert.Equal(0, api.StartCount); Assert.Equal(1, api.StopCount); Assert.Equal(0, session.MatchCount); } [Fact] public async Task Close는_Stop을_호출하고_상태를_초기화한다() { var api = new FakeFindApi(); var session = new FindSession(api); await session.StartAsync("x"); api.RaiseCount(5); api.RaiseActive(2); session.Close(); Assert.Equal(1, api.StopCount); Assert.Equal(0, session.MatchCount); Assert.Equal(-1, session.ActiveMatchIndex); // -1 = 활성 매치 없음(Start 초기값과 동일 센티넬) Assert.Equal(string.Empty, session.Term); } }