using AvParser.UI.Navigation; using AvParser.UI.Tests.Fakes; using AvParser.UI.ViewModels; namespace AvParser.UI.Tests; public class NavigationServiceTests { private static (NavigationService Service, FakePage First, FakePage Second, OtherFakePage Third) Build() { var first = new FakePage("First"); var second = new FakePage("Second"); var third = new OtherFakePage(); return (new NavigationService([first, second, third]), first, second, third); } [Fact] public void Starts_on_the_first_registered_page() { var (service, first, _, _) = Build(); service.Current.ShouldBeSameAs(first); } [Fact] public void Rejects_an_empty_page_set() => Should.Throw(() => new NavigationService(Array.Empty())); [Fact] public void Navigating_pushes_the_previous_page() { var (service, first, second, _) = Build(); service.NavigateTo(second); service.Current.ShouldBeSameAs(second); service.GoBack(); service.Current.ShouldBeSameAs(first); } [Fact] public void Navigating_to_the_current_page_is_a_no_op() { var (service, first, _, _) = Build(); service.NavigateTo(first); service.GoBack(); // Nothing was pushed, so GoBack had nothing to pop. service.Current.ShouldBeSameAs(first); } [Fact] public void GoBack_on_an_empty_stack_does_nothing() { var (service, first, _, _) = Build(); service.GoBack(); service.Current.ShouldBeSameAs(first); } [Fact] public void CanGoBack_tracks_the_stack() { var (service, _, second, _) = Build(); var observed = new List(); using var subscription = service.CanGoBack.Subscribe(observed.Add); service.NavigateTo(second); service.GoBack(); observed.ShouldBe([false, true, false]); } [Fact] public void Navigates_by_type() { var (service, _, _, third) = Build(); service.NavigateTo(); service.Current.ShouldBeSameAs(third); } [Fact] public void Throws_when_navigating_to_an_unregistered_type() { var service = new NavigationService([new FakePage("Only")]); Should .Throw(service.NavigateTo) .Message.ShouldContain("OtherFakePage"); } [Fact] public void CurrentChanges_replays_the_present_value() { var (service, first, second, _) = Build(); service.NavigateTo(second); PageViewModel? seen = null; using var subscription = service.CurrentChanges.Subscribe(page => { seen ??= page; }); seen.ShouldBeSameAs(second); seen.ShouldNotBeSameAs(first); } }