Skip to content

Commit

Permalink
Modify NavigateFromAsync method and unittests.
Browse files Browse the repository at this point in the history
  • Loading branch information
niimima committed Jul 5, 2024
1 parent 6ee0fa4 commit 86b68a5
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 38 deletions.
17 changes: 7 additions & 10 deletions src/Maui/Prism.Maui/Navigation/PageNavigationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -346,19 +346,16 @@ public virtual async Task<INavigationResult> NavigateFromAsync(string viewName,

var routeSegments = UriParsingHelper.GetUriSegments(route);

var page = GetPageFromWindow();
if (page is not null && ViewModelLocator.GetNavigationName(page) == viewName)
// Find a page that matches the viewName.
var page = GetCurrentPage();
while (page != null)
{
await ProcessNavigation(page, routeSegments, parameters, null, null);
if (page is not null && ViewModelLocator.GetNavigationName(page) == viewName)
break;
page = page.GetParentPage();
}
else
{
var viewNameSegment = new Queue<string>();
viewNameSegment.Enqueue(viewName);
var navigationSegments = new Queue<string>(viewNameSegment.Concat(routeSegments));

await ProcessNavigationForAbsoluteUri(navigationSegments, parameters, null, null);
}
await ProcessNavigation(page, routeSegments, parameters, null, null);

return Notify(route, parameters);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -510,59 +510,54 @@ public async Task Navigation_Animation_IsFalse()
}

[Fact]
public async Task Navigation_FromPageUsingRoot()
public async Task Navigation_FromPageUsingRoute()
{
var mauiApp = CreateBuilder(prism => prism.CreateWindow("MockHome/NavigationPage/MockViewA"))
.Build();
var window = GetWindow(mauiApp);

Assert.IsAssignableFrom<MockHome>(window.Page);
var rootPage = (MockHome)window.Page;
Assert.NotNull(rootPage);

Assert.NotNull(rootPage.Detail);
Assert.IsAssignableFrom<NavigationPage>(rootPage.Detail);
var navigatingPage = (NavigationPage)rootPage.Detail;
Assert.NotNull(navigatingPage);
Assert.IsType<MockViewA>(navigatingPage.CurrentPage);
var pageNavigatingFrom = (MockHome)window.Page;
var navigationPage = (NavigationPage)pageNavigatingFrom.Detail;
Assert.IsType<MockViewA>(navigationPage.CurrentPage);

var result = await navigatingPage.CurrentPage.GetContainerProvider()
var result = await navigationPage.CurrentPage.GetContainerProvider()
.Resolve<INavigationService>()
.NavigateFromAsync("MockHome", UriParsingHelper.Parse("NavigationPage/MockViewB"), null);

Assert.True(result.Success);

Assert.NotNull(rootPage.Detail);
var navigatedPage = (NavigationPage)rootPage.Detail;
Assert.IsType<MockViewB>(navigatedPage.CurrentPage);
// MockHome(FlyoutPage) has not been replaced.
var pageNavigatedFrom = (MockHome)window.Page;
Assert.Equal(pageNavigatingFrom, pageNavigatedFrom);

// Navigation should be succeeded.
navigationPage = (NavigationPage)pageNavigatedFrom.Detail;
Assert.IsType<MockViewB>(navigationPage.CurrentPage);
}

[Fact]
public async Task Navigation_FromNotRootPageUsingRoot()
public async Task Navigation_FromIntermediatePageUsingRoute()
{
var mauiApp = CreateBuilder(prism => prism.CreateWindow("MockHome/NavigationPage/MockViewA"))
.Build();
var window = GetWindow(mauiApp);

Assert.IsAssignableFrom<MockHome>(window.Page);
var rootPage = (MockHome)window.Page;
Assert.NotNull(rootPage);

Assert.NotNull(rootPage.Detail);
Assert.IsAssignableFrom<NavigationPage>(rootPage.Detail);
var navigatingPage = (NavigationPage)rootPage.Detail;
Assert.NotNull(navigatingPage);
Assert.IsType<MockViewA>(navigatingPage.CurrentPage);
var mockHome = (MockHome)window.Page;
var pageNavigatingFrom = (NavigationPage)mockHome.Detail;
Assert.IsType<MockViewA>(pageNavigatingFrom.CurrentPage);

var result = await navigatingPage.CurrentPage.GetContainerProvider()
var result = await pageNavigatingFrom.CurrentPage.GetContainerProvider()
.Resolve<INavigationService>()
.NavigateFromAsync("NavigationPage", UriParsingHelper.Parse("MockViewB"), null);

Assert.True(result.Success);

Assert.NotNull(rootPage.Detail);
var navigatedPage = (NavigationPage)rootPage.Detail;
Assert.IsType<MockViewB>(navigatedPage.CurrentPage);
// NavigationPage has not been replaced.
var pageNavigatedFrom = (NavigationPage)mockHome.Detail;
Assert.Equal(pageNavigatingFrom, pageNavigatedFrom);

// Navigation should be succeeded.
Assert.IsType<MockViewB>(pageNavigatedFrom.CurrentPage);
}

[Theory]
Expand Down

0 comments on commit 86b68a5

Please sign in to comment.