From c06fe8ca58335f3d4738b6e7ce53544cb01f7b56 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Tue, 4 Feb 2025 12:33:05 -0800 Subject: [PATCH] Add `event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted` to allowunit tests confirm that we initialized the AndroidDialogFragmentService --- .../AppBuilderExtensions.shared.cs | 16 +++- .../Extensions/AppBuilderExtensionsTests.cs | 89 +++++++++++++++---- 2 files changed, 88 insertions(+), 17 deletions(-) diff --git a/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs b/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs index be5b66415..179613b4d 100644 --- a/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs +++ b/src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs @@ -17,6 +17,15 @@ namespace CommunityToolkit.Maui.Core; [SupportedOSPlatform("Tizen6.5")] public static class AppBuilderExtensions { + static readonly WeakEventManager weakEventManager = new(); + + // This is an internal event used by Unit Tests to confirm when the code enters the `if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)` block + internal static event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted + { + add => weakEventManager.AddEventHandler(value); + remove => weakEventManager.RemoveEventHandler(value); + } + /// /// Initializes the .NET MAUI Community Toolkit Core Library /// @@ -27,9 +36,10 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui { options?.Invoke(new Options()); -#if ANDROID if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage) { + +#if ANDROID builder.Services.AddSingleton(); builder.ConfigureLifecycleEvents(static lifecycleBuilder => @@ -58,9 +68,11 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui }); }); }); - } #endif + weakEventManager.HandleEvent(null, EventArgs.Empty, nameof(ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted)); + } + return builder; } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs index d01d11295..4c9a6e977 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs @@ -3,52 +3,101 @@ namespace CommunityToolkit.Maui.UnitTests.Extensions; +#pragma warning disable CA1416 public class AppBuilderExtensionsTests : BaseTest { [Fact] public void ConfirmOptionsDefaultValue() { + // Arrange + bool isAndroidDialogFragmentServiceInitialized = false; + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + // Assert Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage); Assert.False(Options.ShouldEnableSnackbarOnWindows); Assert.False(Options.ShouldSuppressExceptionsInAnimations); Assert.False(Options.ShouldSuppressExceptionsInBehaviors); Assert.False(Options.ShouldSuppressExceptionsInConverters); - } - - [Fact] + Assert.False(isAndroidDialogFragmentServiceInitialized); + + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + + void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e) + { + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + isAndroidDialogFragmentServiceInitialized = true; + } + } + + [Fact] + public void ConfirmDefaultValueRemainWhenOptionsNull() + { + // Arrange + var builder = MauiApp.CreateBuilder(); + bool isAndroidDialogFragmentServiceInitialized = false; + + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + + // Act + builder.UseMauiCommunityToolkit(null); + + // Assert + Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage); + Assert.False(Options.ShouldEnableSnackbarOnWindows); + Assert.False(Options.ShouldSuppressExceptionsInAnimations); + Assert.False(Options.ShouldSuppressExceptionsInBehaviors); + Assert.False(Options.ShouldSuppressExceptionsInConverters); + Assert.True(isAndroidDialogFragmentServiceInitialized); + + void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e) + { + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + isAndroidDialogFragmentServiceInitialized = true; + } + } + + + [Fact] public void UseMauiCommunityToolkit_ShouldRegisterServices() { // Arrange var builder = MauiApp.CreateBuilder(); + bool isAndroidDialogFragmentServiceInitialized = false; + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; - // Act -#pragma warning disable CA1416 - builder.UseMauiCommunityToolkit(); -#pragma warning restore CA1416 + // Act + builder.UseMauiCommunityToolkit(); // Assert var serviceProvider = builder.Services.BuildServiceProvider(); Assert.NotNull(serviceProvider.GetService()); - } + Assert.True(isAndroidDialogFragmentServiceInitialized); + + void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e) + { + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + isAndroidDialogFragmentServiceInitialized = true; + } + } [Fact] public void UseMauiCommunityToolkit_ShouldAssignValues() { // Arrange var builder = MauiApp.CreateBuilder(); + bool isAndroidDialogFragmentServiceInitialized = false; + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; - // Act -#pragma warning disable CA1416 - builder.UseMauiCommunityToolkit(options => + // Act + builder.UseMauiCommunityToolkit(options => { options.SetShouldEnableSnackbarOnWindows(!Options.ShouldEnableSnackbarOnWindows); - options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage); options.SetShouldSuppressExceptionsInAnimations(!Options.ShouldSuppressExceptionsInAnimations); options.SetShouldSuppressExceptionsInBehaviors(!Options.ShouldSuppressExceptionsInBehaviors); options.SetShouldSuppressExceptionsInConverters(!Options.ShouldSuppressExceptionsInConverters); + options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage); }); -#pragma warning restore CA1416 // Assert Assert.False(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage); @@ -56,5 +105,15 @@ public void UseMauiCommunityToolkit_ShouldAssignValues() Assert.True(Options.ShouldSuppressExceptionsInAnimations); Assert.True(Options.ShouldSuppressExceptionsInBehaviors); Assert.True(Options.ShouldSuppressExceptionsInConverters); - } -} \ No newline at end of file + Assert.False(isAndroidDialogFragmentServiceInitialized); + + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + + void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e) + { + Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted; + isAndroidDialogFragmentServiceInitialized = true; + } + } +} +#pragma warning restore CA1416 \ No newline at end of file