Skip to content

Commit

Permalink
[net7.0] Fix reliability of RemoveLastPage test (#13679)
Browse files Browse the repository at this point in the history
Backport of #13663 to net7.0

/cc @rmarinho @PureWeen
  • Loading branch information
PureWeen committed Mar 3, 2023
2 parents 5745e3d + 8d32728 commit f5f22ab
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 21 deletions.
27 changes: 10 additions & 17 deletions src/Controls/tests/Core.UnitTests/NavigationPageLifecycleTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,30 +91,23 @@ public async Task PopLifeCycle(bool useMaui)
[InlineData(true)]
public async Task RemoveLastPage(bool useMaui)
{
ContentPage initialPage = new ContentPage();
ContentPage pushedPage = new ContentPage();
var initialPage = new PageLifeCycleTests.LCPage();
var pushedPage = new PageLifeCycleTests.LCPage();

ContentPage initialPageAppearing = null;
ContentPage pageDisappeared = null;

NavigationPage nav = new TestNavigationPage(useMaui, initialPage);
var nav = new TestNavigationPage(useMaui, initialPage);
_ = new TestWindow(nav);
nav.SendAppearing();

initialPage.Appearing += (sender, _)
=> initialPageAppearing = (ContentPage)sender;

pushedPage.Disappearing += (sender, _)
=> pageDisappeared = (ContentPage)sender;

await nav.PushAsync(pushedPage);
Assert.Null(initialPageAppearing);
Assert.Null(pageDisappeared);
Assert.Equal(1, initialPage.AppearingCount);
Assert.Equal(1, pushedPage.AppearingCount);
Assert.Equal(0, pushedPage.DisappearingCount);

nav.Navigation.RemovePage(pushedPage);
await nav.NavigatingTask;

Assert.Equal(initialPageAppearing, initialPage);
Assert.Equal(pageDisappeared, pushedPage);
Assert.Equal(2, initialPage.AppearingCount);
Assert.Equal(1, pushedPage.AppearingCount);
Assert.Equal(1, pushedPage.DisappearingCount);
}

[Theory]
Expand Down
2 changes: 1 addition & 1 deletion src/Controls/tests/Core.UnitTests/PageLifeCycleTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public async Task PushSecondModalPage()
Assert.Equal(1, firstModalPage.AppearingCount);
}

class LCPage : ContentPage
public class LCPage : ContentPage
{
public NavigatedFromEventArgs NavigatedFromArgs { get; private set; }
public NavigatingFromEventArgs NavigatingFromArgs { get; private set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public async Task<bool> SendBackButtonPressedAsync()
return result;
}


public Task NavigatingTask => Handler?.NavigatingTask ?? Task.CompletedTask;
}

public class TestNavigationHandler : ViewHandler<NavigationPage, object>
Expand All @@ -54,24 +54,36 @@ public static PropertyMapper<IStackNavigationView, TestNavigationHandler> Naviga

public NavigationRequest CurrentNavigationRequest { get; private set; }

TaskCompletionSource _navigationSource;

public Task NavigatingTask => (_navigationSource?.Task ?? Task.CompletedTask);

public void CompleteCurrentNavigation()
public async void CompleteCurrentNavigation()
{
if (CurrentNavigationRequest == null)
throw new InvalidOperationException("No Active Navigation in the works");

var newStack = CurrentNavigationRequest.NavigationStack.ToList();
CurrentNavigationRequest = null;

var source = _navigationSource;
_navigationSource = null;

if ((this as IElementHandler).VirtualView is IStackNavigation sn)
sn.NavigationFinished(newStack);


await Task.Delay(1);
source.SetResult();
}

async void RequestNavigation(NavigationRequest navigationRequest)
{
if (CurrentNavigationRequest != null)
if (CurrentNavigationRequest != null || _navigationSource != null)
throw new InvalidOperationException("Already Processing Navigation");


_navigationSource = new TaskCompletionSource();
CurrentNavigationRequest = navigationRequest;

await Task.Delay(10);
Expand Down

0 comments on commit f5f22ab

Please sign in to comment.