Skip to content

Commit

Permalink
Add `event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageO…
Browse files Browse the repository at this point in the history
…ptionCompleted` to allowunit tests confirm that we initialized the AndroidDialogFragmentService
  • Loading branch information
TheCodeTraveler committed Feb 4, 2025
1 parent 5808042 commit c06fe8c
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 17 deletions.
16 changes: 14 additions & 2 deletions src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/// <summary>
/// Initializes the .NET MAUI Community Toolkit Core Library
/// </summary>
Expand All @@ -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<IDialogFragmentService, DialogFragmentService>();

builder.ConfigureLifecycleEvents(static lifecycleBuilder =>
Expand Down Expand Up @@ -58,9 +68,11 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
});
});
});
}
#endif

weakEventManager.HandleEvent(null, EventArgs.Empty, nameof(ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted));
}

return builder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,58 +3,117 @@

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<IPopupService>());
}
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);
Assert.True(Options.ShouldEnableSnackbarOnWindows);
Assert.True(Options.ShouldSuppressExceptionsInAnimations);
Assert.True(Options.ShouldSuppressExceptionsInBehaviors);
Assert.True(Options.ShouldSuppressExceptionsInConverters);
}
}
Assert.False(isAndroidDialogFragmentServiceInitialized);

Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;

void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
{
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
isAndroidDialogFragmentServiceInitialized = true;
}
}
}
#pragma warning restore CA1416

0 comments on commit c06fe8c

Please sign in to comment.