diff --git a/.github/workflows/dotnet-build.yml b/.github/workflows/dotnet-build.yml index d556bbbaac..5f9b745950 100644 --- a/.github/workflows/dotnet-build.yml +++ b/.github/workflows/dotnet-build.yml @@ -190,7 +190,7 @@ jobs: run: dotnet build ${{ env.PathToLibrarySolution }} -c Release -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }} - name: Run All Unit Tests - run: dotnet test -c Release ${{ env.PathToLibrarySolution }} --settings ".runsettings" --collect "XPlat code coverage" --logger trx --results-directory ${{ runner.temp }} + run: dotnet test -c Release ${{ env.PathToLibrarySolution }} --settings ".runsettings" --collect "XPlat code coverage" --logger trx --results-directory ${{ runner.temp }} --logger GitHubActions - name: Publish Test Results if: runner.os == 'Windows' diff --git a/src/CommunityToolkit.Maui.Analyzers.UnitTests/CommunityToolkit.Maui.Analyzers.UnitTests.csproj b/src/CommunityToolkit.Maui.Analyzers.UnitTests/CommunityToolkit.Maui.Analyzers.UnitTests.csproj index 20c5766db2..5704417b12 100644 --- a/src/CommunityToolkit.Maui.Analyzers.UnitTests/CommunityToolkit.Maui.Analyzers.UnitTests.csproj +++ b/src/CommunityToolkit.Maui.Analyzers.UnitTests/CommunityToolkit.Maui.Analyzers.UnitTests.csproj @@ -20,6 +20,7 @@ + diff --git a/src/CommunityToolkit.Maui.UnitTests/CommunityToolkit.Maui.UnitTests.csproj b/src/CommunityToolkit.Maui.UnitTests/CommunityToolkit.Maui.UnitTests.csproj index 10fa0064f3..d0d74d952a 100644 --- a/src/CommunityToolkit.Maui.UnitTests/CommunityToolkit.Maui.UnitTests.csproj +++ b/src/CommunityToolkit.Maui.UnitTests/CommunityToolkit.Maui.UnitTests.csproj @@ -17,6 +17,7 @@ + diff --git a/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs b/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs index 9a16351207..1a622c3f9f 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs @@ -9,10 +9,12 @@ namespace CommunityToolkit.Maui.UnitTests.Views; public class PopupTests : BaseHandlerTest { const string resultWhenUserTapsOutsideOfPopup = "User Tapped Outside of Popup"; - readonly IPopup popup = new MockPopup(); + readonly MockPopup popup = new(); + readonly MockPopupHandler popupHandler; public PopupTests() { + popupHandler = CreateElementHandler(popup); Assert.IsType(new MockPopup(), exactMatch: false); } @@ -49,15 +51,13 @@ public async Task ShowPopupAsync_CancellationTokenExpired() app.Windows[0].Page = page; - var popupHandler = CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); // Ensure CancellationToken Has Expired await Task.Delay(100, CancellationToken.None); - await Assert.ThrowsAsync(() => page.ShowPopupAsync((MockPopup)popup, cts.Token)); + await Assert.ThrowsAnyAsync(() => page.ShowPopupAsync(popup, cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -80,15 +80,13 @@ public async Task ShowPopupAsync_CancellationTokenCancelled() app.Windows[0].Page = page; - var popupHandler = CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); // Ensure CancellationToken Has Expired await cts.CancelAsync(); - await Assert.ThrowsAsync(() => page.ShowPopupAsync((MockPopup)popup, cts.Token)); + await Assert.ThrowsAnyAsync(() => page.ShowPopupAsync(popup, cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -111,15 +109,13 @@ public async Task CloseAsync_CancellationTokenExpired() app.Windows[0].Page = page; - var popupHandler = CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); // Ensure CancellationToken Has Expired await Task.Delay(100, CancellationToken.None); - await Assert.ThrowsAsync(() => ((MockPopup)popup).CloseAsync(token: cts.Token)); + await Assert.ThrowsAnyAsync(() => popup.CloseAsync(token: cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -142,15 +138,13 @@ public async Task CloseAsync_CancellationTokenCancelled() app.Windows[0].Page = page; - var popupHandler = CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); // Ensure CancellationToken Has Expired await cts.CancelAsync(); - await Assert.ThrowsAsync(() => ((MockPopup)popup).CloseAsync(token: cts.Token)); + await Assert.ThrowsAnyAsync(() => popup.CloseAsync(token: cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -171,17 +165,15 @@ public async Task OnOpenedMapperIsCalled() app.Windows[0].Page = page; - var popupHandler = CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); - page.ShowPopup((MockPopup)popup); + page.ShowPopup(popup); Assert.Equal(1, popupHandler.OnOpenedCount); - popup.OnDismissedByTappingOutsideOfPopup(); + await popup.OnDismissedByTappingOutsideOfPopup(CancellationToken.None); - var popupTask = page.ShowPopupAsync((MockPopup)popup, CancellationToken.None); - popup.OnDismissedByTappingOutsideOfPopup(); + var popupTask = page.ShowPopupAsync(popup, CancellationToken.None); + await popup.OnDismissedByTappingOutsideOfPopup(CancellationToken.None); await popupTask; @@ -202,7 +194,7 @@ public async Task PopupDismissedByTappingOutsideOfPopup() } }; - ((MockPopup)popup).Closed += (s, e) => + popup.Closed += (s, e) => { Assert.Equal(popup, s); popupClosedTCS.SetResult(((string?)e.Result, e.WasDismissedByTappingOutsideOfPopup)); @@ -213,12 +205,10 @@ public async Task PopupDismissedByTappingOutsideOfPopup() app.Windows[0].Page = page; - CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); - popup.OnDismissedByTappingOutsideOfPopup(); + await popup.OnDismissedByTappingOutsideOfPopup(CancellationToken.None); var (result, wasDismissedByTappingOutsideOfPopup) = await popupClosedTCS.Task; @@ -247,20 +237,17 @@ public async Task OnDismissedWithResult() app.Windows[0].Page = page; - // Make sure that our popup will have a Handler - CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); - ((MockPopup)popup).Closed += (_, e) => + popup.Closed += (_, e) => { result = e.Result; isPopupDismissed = true; - closedTCS.TrySetResult(); + closedTCS.SetResult(); }; - ((MockPopup)popup).Close(new object()); + popup.Close(new object()); await closedTCS.Task; Assert.True(isPopupDismissed); @@ -288,19 +275,16 @@ public async Task OnDismissedWithoutResult() app.Windows[0].Page = page; - // Make sure that our popup will have a Handler - CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); - ((MockPopup)popup).Closed += (_, e) => + popup.Closed += (_, e) => { result = e.Result; isPopupDismissed = true; }; - await ((MockPopup)popup).CloseAsync(token: CancellationToken.None); + await popup.CloseAsync(token: CancellationToken.None); Assert.True(isPopupDismissed); Assert.Null(result); @@ -341,17 +325,14 @@ public async Task ShowPopup_IsLogicalChild() app.Windows[0].Page = page; - // Make sure that our popup will have a Handler - CreateElementHandler(popup); - Assert.NotNull(popup.Handler); Assert.NotNull(page.Handler); Assert.Single(page.LogicalChildrenInternal); - page.ShowPopup((MockPopup)popup); + page.ShowPopup(popup); Assert.Equal(2, page.LogicalChildrenInternal.Count); - await ((MockPopup)popup).CloseAsync(token: CancellationToken.None); + await popup.CloseAsync(token: CancellationToken.None); Assert.Single(page.LogicalChildrenInternal); } @@ -361,15 +342,6 @@ public MockPopup() { ResultWhenUserTapsOutsideOfPopup = resultWhenUserTapsOutsideOfPopup; } - - protected override async Task OnClosed(object? result, bool wasDismissedByTappingOutsideOfPopup, CancellationToken token = default) - { - await Task.Delay(100, token); - - ((IPopup)this).HandlerCompleteTCS.TrySetResult(); - - await base.OnClosed(result, wasDismissedByTappingOutsideOfPopup, token); - } } sealed class PopupViewModel : INotifyPropertyChanged diff --git a/src/CommunityToolkit.Maui/Views/Popup/Popup.shared.cs b/src/CommunityToolkit.Maui/Views/Popup/Popup.shared.cs index 5c058b773e..2099c179ed 100644 --- a/src/CommunityToolkit.Maui/Views/Popup/Popup.shared.cs +++ b/src/CommunityToolkit.Maui/Views/Popup/Popup.shared.cs @@ -343,6 +343,8 @@ internal virtual void OnOpened() => /// protected virtual async Task OnClosed(object? result, bool wasDismissedByTappingOutsideOfPopup, CancellationToken token = default) { + token.ThrowIfCancellationRequested(); + ((IPopup)this).OnClosed(result); ((IResourceDictionary)resources).ValuesChanged -= OnResourcesChanged;