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;