From a2fcac18a9203f363176fedbc0dd8ba3b67e3582 Mon Sep 17 00:00:00 2001 From: Satoshi Nakamura Date: Sat, 30 Jul 2022 20:35:12 +0900 Subject: [PATCH] Add AddTabbedSegment with segment name --- .../Navigation/Builder/INavigationBuilder.cs | 1 + .../Navigation/Builder/NavigationBuilder.cs | 8 +++ .../Builder/TabbedSegmentBuilder.cs | 15 +++++ .../Navigation/NavigationBuilderFixture.cs | 58 +++++++++++++++++++ 4 files changed, 82 insertions(+) diff --git a/src/Prism.Maui/Navigation/Builder/INavigationBuilder.cs b/src/Prism.Maui/Navigation/Builder/INavigationBuilder.cs index a9947fb..8151c05 100644 --- a/src/Prism.Maui/Navigation/Builder/INavigationBuilder.cs +++ b/src/Prism.Maui/Navigation/Builder/INavigationBuilder.cs @@ -5,6 +5,7 @@ public interface INavigationBuilder Uri Uri { get; } INavigationBuilder AddSegment(string segmentName, Action configureSegment); INavigationBuilder AddTabbedSegment(Action configuration); + INavigationBuilder AddTabbedSegment(string segmentName, Action configureSegment); INavigationBuilder WithParameters(INavigationParameters parameters); INavigationBuilder AddParameter(string key, object value); diff --git a/src/Prism.Maui/Navigation/Builder/NavigationBuilder.cs b/src/Prism.Maui/Navigation/Builder/NavigationBuilder.cs index 3b7e9b6..c22819a 100644 --- a/src/Prism.Maui/Navigation/Builder/NavigationBuilder.cs +++ b/src/Prism.Maui/Navigation/Builder/NavigationBuilder.cs @@ -39,6 +39,14 @@ public INavigationBuilder AddTabbedSegment(Action configu return this; } + public INavigationBuilder AddTabbedSegment(string segmentName, Action configureSegment) + { + var builder = new TabbedSegmentBuilder(this, segmentName); + configureSegment?.Invoke(builder); + _uriSegments.Add(builder); + return this; + } + public INavigationBuilder AddParameter(string key, object value) { _navigationParameters.Add(key, value); diff --git a/src/Prism.Maui/Navigation/Builder/TabbedSegmentBuilder.cs b/src/Prism.Maui/Navigation/Builder/TabbedSegmentBuilder.cs index ccd413f..097abd2 100644 --- a/src/Prism.Maui/Navigation/Builder/TabbedSegmentBuilder.cs +++ b/src/Prism.Maui/Navigation/Builder/TabbedSegmentBuilder.cs @@ -24,6 +24,21 @@ public TabbedSegmentBuilder(INavigationBuilder builder) SegmentName = registration.Name; } + public TabbedSegmentBuilder(INavigationBuilder builder, string segmentName) + { + _builder = builder; + _parameters = new NavigationParameters(); + + if (builder is not IRegistryAware registryAware) + throw new Exception("The builder does not implement IRegistryAware"); + + var registration = registryAware.Registry.ViewsOfType(typeof(TabbedPage)).FirstOrDefault(x => x.Name == segmentName); + if (registration == null) + throw new NavigationException(NavigationException.NoPageIsRegistered, nameof(TabbedPage)); + + SegmentName = registration.Name; + } + IViewRegistry IRegistryAware.Registry => ((IRegistryAware)_builder).Registry; public string SegmentName { get; set; } diff --git a/tests/Prism.Maui.Tests/Fixtures/Navigation/NavigationBuilderFixture.cs b/tests/Prism.Maui.Tests/Fixtures/Navigation/NavigationBuilderFixture.cs index 1487f5a..ec5b7c5 100644 --- a/tests/Prism.Maui.Tests/Fixtures/Navigation/NavigationBuilderFixture.cs +++ b/tests/Prism.Maui.Tests/Fixtures/Navigation/NavigationBuilderFixture.cs @@ -4,6 +4,7 @@ using Moq; using Prism.Common; using Prism.Maui.Tests.Mocks.Ioc; +using Prism.Maui.Tests.Navigation.Mocks.Views; namespace Prism.Maui.Tests.Fixtures.Navigation; @@ -114,6 +115,63 @@ public void GeneratesTabbedPageUriWithCreatedTabsWithParameters() Assert.Contains(parameters, x => HttpUtility.UrlDecode(x.Value.ToString()) == "ViewB?foo=bar"); } + [Fact] + public void GeneratesCustomTabbedPageUriWithCreatedTabs() + { + var container = new TestContainer(); + container.RegisterForNavigation(); + container.RegisterForNavigation(); + + var navigationService = new Mock(); + navigationService + .As() + .Setup(x => x.Registry) + .Returns(container.Resolve()); + var uri = navigationService.Object + .CreateBuilder() + .AddTabbedSegment("TabbedPageEmptyMock", b => + { + b.CreateTab("ViewA") + .CreateTab("ViewB") + .CreateTab("ViewC"); + }) + .Uri; + + Assert.Equal("TabbedPageEmptyMock?createTab=ViewA&createTab=ViewB&createTab=ViewC", uri.ToString()); + } + + [Fact] + public void GeneratesCustomTabbedPageUriWithCreatedTabsWithParameters() + { + var container = new TestContainer(); + container.RegisterForNavigation(); + container.RegisterForNavigation(); + + var navigationService = new Mock(); + navigationService + .As() + .Setup(x => x.Registry) + .Returns(container.Resolve()); + var uri = navigationService.Object + .CreateBuilder() + .AddTabbedSegment("TabbedPageEmptyMock", b => + { + b.CreateTab("ViewA", t => t.AddParameter("id", 5)) + .CreateTab("ViewB", t => t.AddParameter("foo", "bar")) + .CreateTab("ViewC"); + }) + .Uri; + + Assert.Equal("TabbedPageEmptyMock?createTab=ViewA%3Fid%3D5&createTab=ViewB%3Ffoo%3Dbar&createTab=ViewC", uri.ToString()); + + var parameters = UriParsingHelper.GetSegmentParameters(uri.ToString()); + Assert.Equal(3, parameters.Count); + Assert.True(parameters.All(x => x.Key == KnownNavigationParameters.CreateTab)); + + Assert.Contains(parameters, x => HttpUtility.UrlDecode(x.Value.ToString()) == "ViewA?id=5"); + Assert.Contains(parameters, x => HttpUtility.UrlDecode(x.Value.ToString()) == "ViewB?foo=bar"); + } + [Fact] public void GeneratesDeepLinkTabCreation() {