|
8 | 8 | using Nito.AsyncEx; |
9 | 9 | using Xunit; |
10 | 10 | using Application = Microsoft.Maui.Controls.Application; |
| 11 | +using NavigationPage = Microsoft.Maui.Controls.NavigationPage; |
11 | 12 | using Page = Microsoft.Maui.Controls.Page; |
12 | 13 |
|
13 | 14 | namespace CommunityToolkit.Maui.UnitTests.Views; |
@@ -169,6 +170,132 @@ public async Task PopupPageT_CloseAfterAdditionalModalPage_ShouldThrowInvalidOpe |
169 | 170 | await Assert.ThrowsAnyAsync<InvalidOperationException>(async () => await popupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
170 | 171 | } |
171 | 172 |
|
| 173 | + [Fact] |
| 174 | + public async Task PopupPageT_CloseWhenUsingCustomNavigationPage_ShouldClose() |
| 175 | + { |
| 176 | + // Arrange |
| 177 | + if (Application.Current?.Windows[0].Page?.Navigation is not INavigation navigation) |
| 178 | + { |
| 179 | + throw new InvalidOperationException("Unable to locate Navigation page"); |
| 180 | + } |
| 181 | + |
| 182 | + bool wasPopupPageClosed = false; |
| 183 | + |
| 184 | + var view = new ContentView(); |
| 185 | + var popupOptions = new MockPopupOptions(); |
| 186 | + var popupPage = new PopupPage<string>(view, popupOptions); |
| 187 | + popupPage.PopupClosed += HandlePopupPageClosed; |
| 188 | + |
| 189 | + var onAppearingPage = new ContentPage(); |
| 190 | + var customNavigationPage = new NavigationPage(onAppearingPage); |
| 191 | + onAppearingPage.NavigatedTo += HandlePageNavigatedTo; |
| 192 | + |
| 193 | + // Act |
| 194 | + await Shell.Current.Navigation.PushModalAsync(customNavigationPage, true); |
| 195 | + await popupPage.CloseAsync(new PopupResult(false), CancellationToken.None); |
| 196 | + |
| 197 | + // Assert |
| 198 | + Assert.True(wasPopupPageClosed); |
| 199 | + |
| 200 | + async void HandlePageNavigatedTo(object? sender, NavigatedToEventArgs e) |
| 201 | + { |
| 202 | + if (!e.WasPreviousPageACommunityToolkitPopupPage()) |
| 203 | + { |
| 204 | + await customNavigationPage.Navigation.PushModalAsync(popupPage); |
| 205 | + } |
| 206 | + } |
| 207 | + |
| 208 | + void HandlePopupPageClosed(object? sender, IPopupResult e) |
| 209 | + { |
| 210 | + wasPopupPageClosed = true; |
| 211 | + } |
| 212 | + } |
| 213 | + |
| 214 | + [Fact] |
| 215 | + public async Task PopupPageT_CloseAfterAdditionalModalPageToCustomNavigationPage_ShouldThrowPopupBlockedException() |
| 216 | + { |
| 217 | + // Arrange |
| 218 | + bool wasPopupPageClosed = false; |
| 219 | + |
| 220 | + var view = new ContentView(); |
| 221 | + var popupOptions = new MockPopupOptions(); |
| 222 | + var firstPopupPage = new PopupPage<string>(view, popupOptions); |
| 223 | + firstPopupPage.PopupClosed += HandlePopupPageClosed; |
| 224 | + |
| 225 | + var onAppearingPage = new ContentPage(); |
| 226 | + var customNavigationPage = new NavigationPage(onAppearingPage); |
| 227 | + onAppearingPage.NavigatedTo += HandlePageNavigatedTo; |
| 228 | + |
| 229 | + var secondPopupPage = new PopupPage<string>(new Button(), popupOptions); |
| 230 | + |
| 231 | + // Act |
| 232 | + await Shell.Current.Navigation.PushModalAsync(customNavigationPage, true); |
| 233 | + await customNavigationPage.Navigation.PushModalAsync(secondPopupPage); |
| 234 | + |
| 235 | + // Assert |
| 236 | + await Assert.ThrowsAsync<PopupBlockedException>(async () => await firstPopupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
| 237 | + await Assert.ThrowsAnyAsync<InvalidPopupOperationException>(async () => await firstPopupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
| 238 | + await Assert.ThrowsAnyAsync<InvalidOperationException>(async () => await firstPopupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
| 239 | + Assert.False(wasPopupPageClosed); |
| 240 | + |
| 241 | + async void HandlePageNavigatedTo(object? sender, NavigatedToEventArgs e) |
| 242 | + { |
| 243 | + if (!e.WasPreviousPageACommunityToolkitPopupPage()) |
| 244 | + { |
| 245 | + await customNavigationPage.Navigation.PushModalAsync(firstPopupPage); |
| 246 | + } |
| 247 | + } |
| 248 | + |
| 249 | + void HandlePopupPageClosed(object? sender, IPopupResult e) |
| 250 | + { |
| 251 | + wasPopupPageClosed = true; |
| 252 | + } |
| 253 | + } |
| 254 | + |
| 255 | + [Fact] |
| 256 | + public async Task PopupPageT_CloseAfterAdditionalModalPageToCustomNavigationPage_ShouldThrowPopupNotFound() |
| 257 | + { |
| 258 | + // Arrange |
| 259 | + if (Application.Current?.Windows[0].Page?.Navigation is not INavigation navigation) |
| 260 | + { |
| 261 | + throw new InvalidOperationException("Unable to locate Navigation page"); |
| 262 | + } |
| 263 | + |
| 264 | + bool wasPopupPageClosed = false; |
| 265 | + |
| 266 | + var view = new ContentView(); |
| 267 | + var popupOptions = new MockPopupOptions(); |
| 268 | + var popupPage = new PopupPage<string>(view, popupOptions); |
| 269 | + popupPage.PopupClosed += HandlePopupPageClosed; |
| 270 | + |
| 271 | + var onAppearingPage = new ContentPage(); |
| 272 | + var customNavigationPage = new NavigationPage(onAppearingPage); |
| 273 | + onAppearingPage.NavigatedTo += HandlePageNavigatedTo; |
| 274 | + |
| 275 | + // Act |
| 276 | + await Shell.Current.Navigation.PushModalAsync(customNavigationPage, true); |
| 277 | + await customNavigationPage.Navigation.PushModalAsync(new ContentPage()); |
| 278 | + |
| 279 | + // Assert |
| 280 | + await Assert.ThrowsAsync<PopupNotFoundException>(async () => await popupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
| 281 | + await Assert.ThrowsAnyAsync<InvalidPopupOperationException>(async () => await popupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
| 282 | + await Assert.ThrowsAnyAsync<InvalidOperationException>(async () => await popupPage.CloseAsync(new PopupResult(false), CancellationToken.None)); |
| 283 | + Assert.False(wasPopupPageClosed); |
| 284 | + |
| 285 | + async void HandlePageNavigatedTo(object? sender, NavigatedToEventArgs e) |
| 286 | + { |
| 287 | + if (!e.WasPreviousPageACommunityToolkitPopupPage()) |
| 288 | + { |
| 289 | + await customNavigationPage.Navigation.PushModalAsync(popupPage); |
| 290 | + } |
| 291 | + } |
| 292 | + |
| 293 | + void HandlePopupPageClosed(object? sender, IPopupResult e) |
| 294 | + { |
| 295 | + wasPopupPageClosed = true; |
| 296 | + } |
| 297 | + } |
| 298 | + |
172 | 299 | [Fact] |
173 | 300 | public void PopupPageT_Close_ShouldThrowOperationCanceledException_WhenTokenIsCancelled() |
174 | 301 | { |
|
0 commit comments