From 4167445efa2a0c8e7a9067939bc4ae26b1c63bd3 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:02:21 -0800 Subject: [PATCH 1/3] Update tests --- .../Mocks/MockPopupHandler.cs | 2 +- .../Views/Popup/PopupTests.cs | 68 ++++++------------- .../Views/Popup/Popup.shared.cs | 2 + 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs index 407065186c..58ce159d43 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs @@ -36,6 +36,6 @@ static void MapOnOpened(MockPopupHandler arg1, IPopup arg2, object? arg3) static void MapOnClosed(MockPopupHandler handler, IPopup view, object? result) { - view.HandlerCompleteTCS.TrySetResult(); + view.HandlerCompleteTCS.SetResult(); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs b/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs index 9a16351207..6284b9fde5 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.ThrowsAsync(() => 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.ThrowsAsync(() => 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.ThrowsAsync(() => 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.ThrowsAsync(() => 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; From a9afa89a904b01b4732e5cf5eff4d6bd209d6276 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:08:16 -0800 Subject: [PATCH 2/3] Use `Assert.ThrowsAnyAsync` --- .../Mocks/MockPopupHandler.cs | 2 +- .../Views/Popup/PopupTests.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs index 58ce159d43..407065186c 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockPopupHandler.cs @@ -36,6 +36,6 @@ static void MapOnOpened(MockPopupHandler arg1, IPopup arg2, object? arg3) static void MapOnClosed(MockPopupHandler handler, IPopup view, object? result) { - view.HandlerCompleteTCS.SetResult(); + view.HandlerCompleteTCS.TrySetResult(); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs b/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs index 6284b9fde5..1a622c3f9f 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs @@ -57,7 +57,7 @@ public async Task ShowPopupAsync_CancellationTokenExpired() // Ensure CancellationToken Has Expired await Task.Delay(100, CancellationToken.None); - await Assert.ThrowsAsync(() => page.ShowPopupAsync(popup, cts.Token)); + await Assert.ThrowsAnyAsync(() => page.ShowPopupAsync(popup, cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -86,7 +86,7 @@ public async Task ShowPopupAsync_CancellationTokenCancelled() // Ensure CancellationToken Has Expired await cts.CancelAsync(); - await Assert.ThrowsAsync(() => page.ShowPopupAsync(popup, cts.Token)); + await Assert.ThrowsAnyAsync(() => page.ShowPopupAsync(popup, cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -115,7 +115,7 @@ public async Task CloseAsync_CancellationTokenExpired() // Ensure CancellationToken Has Expired await Task.Delay(100, CancellationToken.None); - await Assert.ThrowsAsync(() => popup.CloseAsync(token: cts.Token)); + await Assert.ThrowsAnyAsync(() => popup.CloseAsync(token: cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -144,7 +144,7 @@ public async Task CloseAsync_CancellationTokenCancelled() // Ensure CancellationToken Has Expired await cts.CancelAsync(); - await Assert.ThrowsAsync(() => popup.CloseAsync(token: cts.Token)); + await Assert.ThrowsAnyAsync(() => popup.CloseAsync(token: cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] From 16b1e0a0a00650713488d1e6181802ffddf99b5b Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+TheCodeTraveler@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:07:58 -0800 Subject: [PATCH 3/3] Add GitHub Logger --- .github/workflows/dotnet-build.yml | 2 +- .../CommunityToolkit.Maui.Analyzers.UnitTests.csproj | 1 + .../CommunityToolkit.Maui.UnitTests.csproj | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) 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 @@ +