Skip to content

Commit d694f5f

Browse files
[Housekeeping] Fix Unit Test Failure: Catastrophic failure: System.ArgumentOutOfRangeException (#2479)
* Update tests * Use `Assert.ThrowsAnyAsync` --------- Co-authored-by: Brandon Minnick <13558917+brminnick@users.noreply.github.com>
1 parent 0bf5414 commit d694f5f

File tree

5 files changed

+25
-49
lines changed

5 files changed

+25
-49
lines changed

.github/workflows/dotnet-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ jobs:
190190
run: dotnet build ${{ env.PathToLibrarySolution }} -c Release -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }}
191191

192192
- name: Run All Unit Tests
193-
run: dotnet test -c Release ${{ env.PathToLibrarySolution }} --settings ".runsettings" --collect "XPlat code coverage" --logger trx --results-directory ${{ runner.temp }}
193+
run: dotnet test -c Release ${{ env.PathToLibrarySolution }} --settings ".runsettings" --collect "XPlat code coverage" --logger trx --results-directory ${{ runner.temp }} --logger GitHubActions
194194

195195
- name: Publish Test Results
196196
if: runner.os == 'Windows'

src/CommunityToolkit.Maui.Analyzers.UnitTests/CommunityToolkit.Maui.Analyzers.UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<PackageReference Include="coverlet.collector" Version="6.0.4" PrivateAssets="All" />
2121
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.12.0" />
2222
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiPackageVersion)" />
23+
<PackageReference Include="GitHubActionsTestLogger" Version="2.4.1" PrivateAssets="All" />
2324
</ItemGroup>
2425

2526
<ItemGroup>

src/CommunityToolkit.Maui.UnitTests/CommunityToolkit.Maui.UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.1" PrivateAssets="All" />
1818
<PackageReference Include="coverlet.collector" Version="6.0.4" PrivateAssets="All" />
1919
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiPackageVersion)"/>
20+
<PackageReference Include="GitHubActionsTestLogger" Version="2.4.1" PrivateAssets="All" />
2021
</ItemGroup>
2122

2223
<ItemGroup>

src/CommunityToolkit.Maui.UnitTests/Views/Popup/PopupTests.cs

Lines changed: 20 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ namespace CommunityToolkit.Maui.UnitTests.Views;
99
public class PopupTests : BaseHandlerTest
1010
{
1111
const string resultWhenUserTapsOutsideOfPopup = "User Tapped Outside of Popup";
12-
readonly IPopup popup = new MockPopup();
12+
readonly MockPopup popup = new();
13+
readonly MockPopupHandler popupHandler;
1314

1415
public PopupTests()
1516
{
17+
popupHandler = CreateElementHandler<MockPopupHandler>(popup);
1618
Assert.IsType<IPopup>(new MockPopup(), exactMatch: false);
1719
}
1820

@@ -49,15 +51,13 @@ public async Task ShowPopupAsync_CancellationTokenExpired()
4951

5052
app.Windows[0].Page = page;
5153

52-
var popupHandler = CreateElementHandler<MockPopupHandler>(popup);
53-
5454
Assert.NotNull(popup.Handler);
5555
Assert.NotNull(page.Handler);
5656

5757
// Ensure CancellationToken Has Expired
5858
await Task.Delay(100, CancellationToken.None);
5959

60-
await Assert.ThrowsAsync<TaskCanceledException>(() => page.ShowPopupAsync((MockPopup)popup, cts.Token));
60+
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => page.ShowPopupAsync(popup, cts.Token));
6161
}
6262

6363
[Fact(Timeout = (int)TestDuration.Short)]
@@ -80,15 +80,13 @@ public async Task ShowPopupAsync_CancellationTokenCancelled()
8080

8181
app.Windows[0].Page = page;
8282

83-
var popupHandler = CreateElementHandler<MockPopupHandler>(popup);
84-
8583
Assert.NotNull(popup.Handler);
8684
Assert.NotNull(page.Handler);
8785

8886
// Ensure CancellationToken Has Expired
8987
await cts.CancelAsync();
9088

91-
await Assert.ThrowsAsync<TaskCanceledException>(() => page.ShowPopupAsync((MockPopup)popup, cts.Token));
89+
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => page.ShowPopupAsync(popup, cts.Token));
9290
}
9391

9492
[Fact(Timeout = (int)TestDuration.Short)]
@@ -111,15 +109,13 @@ public async Task CloseAsync_CancellationTokenExpired()
111109

112110
app.Windows[0].Page = page;
113111

114-
var popupHandler = CreateElementHandler<MockPopupHandler>(popup);
115-
116112
Assert.NotNull(popup.Handler);
117113
Assert.NotNull(page.Handler);
118114

119115
// Ensure CancellationToken Has Expired
120116
await Task.Delay(100, CancellationToken.None);
121117

122-
await Assert.ThrowsAsync<TaskCanceledException>(() => ((MockPopup)popup).CloseAsync(token: cts.Token));
118+
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => popup.CloseAsync(token: cts.Token));
123119
}
124120

125121
[Fact(Timeout = (int)TestDuration.Short)]
@@ -142,15 +138,13 @@ public async Task CloseAsync_CancellationTokenCancelled()
142138

143139
app.Windows[0].Page = page;
144140

145-
var popupHandler = CreateElementHandler<MockPopupHandler>(popup);
146-
147141
Assert.NotNull(popup.Handler);
148142
Assert.NotNull(page.Handler);
149143

150144
// Ensure CancellationToken Has Expired
151145
await cts.CancelAsync();
152146

153-
await Assert.ThrowsAsync<TaskCanceledException>(() => ((MockPopup)popup).CloseAsync(token: cts.Token));
147+
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => popup.CloseAsync(token: cts.Token));
154148
}
155149

156150
[Fact(Timeout = (int)TestDuration.Short)]
@@ -171,17 +165,15 @@ public async Task OnOpenedMapperIsCalled()
171165

172166
app.Windows[0].Page = page;
173167

174-
var popupHandler = CreateElementHandler<MockPopupHandler>(popup);
175-
176168
Assert.NotNull(popup.Handler);
177169
Assert.NotNull(page.Handler);
178170

179-
page.ShowPopup((MockPopup)popup);
171+
page.ShowPopup(popup);
180172
Assert.Equal(1, popupHandler.OnOpenedCount);
181-
popup.OnDismissedByTappingOutsideOfPopup();
173+
await popup.OnDismissedByTappingOutsideOfPopup(CancellationToken.None);
182174

183-
var popupTask = page.ShowPopupAsync((MockPopup)popup, CancellationToken.None);
184-
popup.OnDismissedByTappingOutsideOfPopup();
175+
var popupTask = page.ShowPopupAsync(popup, CancellationToken.None);
176+
await popup.OnDismissedByTappingOutsideOfPopup(CancellationToken.None);
185177

186178
await popupTask;
187179

@@ -202,7 +194,7 @@ public async Task PopupDismissedByTappingOutsideOfPopup()
202194
}
203195
};
204196

205-
((MockPopup)popup).Closed += (s, e) =>
197+
popup.Closed += (s, e) =>
206198
{
207199
Assert.Equal(popup, s);
208200
popupClosedTCS.SetResult(((string?)e.Result, e.WasDismissedByTappingOutsideOfPopup));
@@ -213,12 +205,10 @@ public async Task PopupDismissedByTappingOutsideOfPopup()
213205

214206
app.Windows[0].Page = page;
215207

216-
CreateElementHandler<MockPopupHandler>(popup);
217-
218208
Assert.NotNull(popup.Handler);
219209
Assert.NotNull(page.Handler);
220210

221-
popup.OnDismissedByTappingOutsideOfPopup();
211+
await popup.OnDismissedByTappingOutsideOfPopup(CancellationToken.None);
222212

223213
var (result, wasDismissedByTappingOutsideOfPopup) = await popupClosedTCS.Task;
224214

@@ -247,20 +237,17 @@ public async Task OnDismissedWithResult()
247237

248238
app.Windows[0].Page = page;
249239

250-
// Make sure that our popup will have a Handler
251-
CreateElementHandler<MockPopupHandler>(popup);
252-
253240
Assert.NotNull(popup.Handler);
254241
Assert.NotNull(page.Handler);
255242

256-
((MockPopup)popup).Closed += (_, e) =>
243+
popup.Closed += (_, e) =>
257244
{
258245
result = e.Result;
259246
isPopupDismissed = true;
260-
closedTCS.TrySetResult();
247+
closedTCS.SetResult();
261248
};
262249

263-
((MockPopup)popup).Close(new object());
250+
popup.Close(new object());
264251
await closedTCS.Task;
265252

266253
Assert.True(isPopupDismissed);
@@ -288,19 +275,16 @@ public async Task OnDismissedWithoutResult()
288275

289276
app.Windows[0].Page = page;
290277

291-
// Make sure that our popup will have a Handler
292-
CreateElementHandler<MockPopupHandler>(popup);
293-
294278
Assert.NotNull(popup.Handler);
295279
Assert.NotNull(page.Handler);
296280

297-
((MockPopup)popup).Closed += (_, e) =>
281+
popup.Closed += (_, e) =>
298282
{
299283
result = e.Result;
300284
isPopupDismissed = true;
301285
};
302286

303-
await ((MockPopup)popup).CloseAsync(token: CancellationToken.None);
287+
await popup.CloseAsync(token: CancellationToken.None);
304288

305289
Assert.True(isPopupDismissed);
306290
Assert.Null(result);
@@ -341,17 +325,14 @@ public async Task ShowPopup_IsLogicalChild()
341325

342326
app.Windows[0].Page = page;
343327

344-
// Make sure that our popup will have a Handler
345-
CreateElementHandler<MockPopupHandler>(popup);
346-
347328
Assert.NotNull(popup.Handler);
348329
Assert.NotNull(page.Handler);
349330

350331
Assert.Single(page.LogicalChildrenInternal);
351-
page.ShowPopup((MockPopup)popup);
332+
page.ShowPopup(popup);
352333
Assert.Equal(2, page.LogicalChildrenInternal.Count);
353334

354-
await ((MockPopup)popup).CloseAsync(token: CancellationToken.None);
335+
await popup.CloseAsync(token: CancellationToken.None);
355336
Assert.Single(page.LogicalChildrenInternal);
356337
}
357338

@@ -361,15 +342,6 @@ public MockPopup()
361342
{
362343
ResultWhenUserTapsOutsideOfPopup = resultWhenUserTapsOutsideOfPopup;
363344
}
364-
365-
protected override async Task OnClosed(object? result, bool wasDismissedByTappingOutsideOfPopup, CancellationToken token = default)
366-
{
367-
await Task.Delay(100, token);
368-
369-
((IPopup)this).HandlerCompleteTCS.TrySetResult();
370-
371-
await base.OnClosed(result, wasDismissedByTappingOutsideOfPopup, token);
372-
}
373345
}
374346

375347
sealed class PopupViewModel : INotifyPropertyChanged

src/CommunityToolkit.Maui/Views/Popup/Popup.shared.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ internal virtual void OnOpened() =>
343343
/// <param name="token"><see cref="CancellationToken"/></param>
344344
protected virtual async Task OnClosed(object? result, bool wasDismissedByTappingOutsideOfPopup, CancellationToken token = default)
345345
{
346+
token.ThrowIfCancellationRequested();
347+
346348
((IPopup)this).OnClosed(result);
347349
((IResourceDictionary)resources).ValuesChanged -= OnResourcesChanged;
348350

0 commit comments

Comments
 (0)