Skip to content

Commit c06fe8c

Browse files
Add event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted to allowunit tests confirm that we initialized the AndroidDialogFragmentService
1 parent 5808042 commit c06fe8c

File tree

2 files changed

+88
-17
lines changed

2 files changed

+88
-17
lines changed

src/CommunityToolkit.Maui.Core/AppBuilderExtensions.shared.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ namespace CommunityToolkit.Maui.Core;
1717
[SupportedOSPlatform("Tizen6.5")]
1818
public static class AppBuilderExtensions
1919
{
20+
static readonly WeakEventManager weakEventManager = new();
21+
22+
// This is an internal event used by Unit Tests to confirm when the code enters the `if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)` block
23+
internal static event EventHandler ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted
24+
{
25+
add => weakEventManager.AddEventHandler(value);
26+
remove => weakEventManager.RemoveEventHandler(value);
27+
}
28+
2029
/// <summary>
2130
/// Initializes the .NET MAUI Community Toolkit Core Library
2231
/// </summary>
@@ -27,9 +36,10 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
2736
{
2837
options?.Invoke(new Options());
2938

30-
#if ANDROID
3139
if (Options.ShouldUseStatusBarBehaviorOnAndroidModalPage)
3240
{
41+
42+
#if ANDROID
3343
builder.Services.AddSingleton<IDialogFragmentService, DialogFragmentService>();
3444

3545
builder.ConfigureLifecycleEvents(static lifecycleBuilder =>
@@ -58,9 +68,11 @@ public static MauiAppBuilder UseMauiCommunityToolkitCore(this MauiAppBuilder bui
5868
});
5969
});
6070
});
61-
}
6271
#endif
6372

73+
weakEventManager.HandleEvent(null, EventArgs.Empty, nameof(ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted));
74+
}
75+
6476
return builder;
6577
}
6678
}

src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs

Lines changed: 74 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,58 +3,117 @@
33

44
namespace CommunityToolkit.Maui.UnitTests.Extensions;
55

6+
#pragma warning disable CA1416
67
public class AppBuilderExtensionsTests : BaseTest
78
{
89
[Fact]
910
public void ConfirmOptionsDefaultValue()
1011
{
12+
// Arrange
13+
bool isAndroidDialogFragmentServiceInitialized = false;
14+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
15+
1116
// Assert
1217
Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
1318
Assert.False(Options.ShouldEnableSnackbarOnWindows);
1419
Assert.False(Options.ShouldSuppressExceptionsInAnimations);
1520
Assert.False(Options.ShouldSuppressExceptionsInBehaviors);
1621
Assert.False(Options.ShouldSuppressExceptionsInConverters);
17-
}
18-
19-
[Fact]
22+
Assert.False(isAndroidDialogFragmentServiceInitialized);
23+
24+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
25+
26+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
27+
{
28+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
29+
isAndroidDialogFragmentServiceInitialized = true;
30+
}
31+
}
32+
33+
[Fact]
34+
public void ConfirmDefaultValueRemainWhenOptionsNull()
35+
{
36+
// Arrange
37+
var builder = MauiApp.CreateBuilder();
38+
bool isAndroidDialogFragmentServiceInitialized = false;
39+
40+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
41+
42+
// Act
43+
builder.UseMauiCommunityToolkit(null);
44+
45+
// Assert
46+
Assert.True(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
47+
Assert.False(Options.ShouldEnableSnackbarOnWindows);
48+
Assert.False(Options.ShouldSuppressExceptionsInAnimations);
49+
Assert.False(Options.ShouldSuppressExceptionsInBehaviors);
50+
Assert.False(Options.ShouldSuppressExceptionsInConverters);
51+
Assert.True(isAndroidDialogFragmentServiceInitialized);
52+
53+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
54+
{
55+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
56+
isAndroidDialogFragmentServiceInitialized = true;
57+
}
58+
}
59+
60+
61+
[Fact]
2062
public void UseMauiCommunityToolkit_ShouldRegisterServices()
2163
{
2264
// Arrange
2365
var builder = MauiApp.CreateBuilder();
66+
bool isAndroidDialogFragmentServiceInitialized = false;
67+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
2468

25-
// Act
26-
#pragma warning disable CA1416
27-
builder.UseMauiCommunityToolkit();
28-
#pragma warning restore CA1416
69+
// Act
70+
builder.UseMauiCommunityToolkit();
2971

3072
// Assert
3173
var serviceProvider = builder.Services.BuildServiceProvider();
3274
Assert.NotNull(serviceProvider.GetService<IPopupService>());
33-
}
75+
Assert.True(isAndroidDialogFragmentServiceInitialized);
76+
77+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
78+
{
79+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
80+
isAndroidDialogFragmentServiceInitialized = true;
81+
}
82+
}
3483

3584
[Fact]
3685
public void UseMauiCommunityToolkit_ShouldAssignValues()
3786
{
3887
// Arrange
3988
var builder = MauiApp.CreateBuilder();
89+
bool isAndroidDialogFragmentServiceInitialized = false;
90+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
4091

41-
// Act
42-
#pragma warning disable CA1416
43-
builder.UseMauiCommunityToolkit(options =>
92+
// Act
93+
builder.UseMauiCommunityToolkit(options =>
4494
{
4595
options.SetShouldEnableSnackbarOnWindows(!Options.ShouldEnableSnackbarOnWindows);
46-
options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
4796
options.SetShouldSuppressExceptionsInAnimations(!Options.ShouldSuppressExceptionsInAnimations);
4897
options.SetShouldSuppressExceptionsInBehaviors(!Options.ShouldSuppressExceptionsInBehaviors);
4998
options.SetShouldSuppressExceptionsInConverters(!Options.ShouldSuppressExceptionsInConverters);
99+
options.SetShouldUseStatusBarBehaviorOnAndroidModalPage(!Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
50100
});
51-
#pragma warning restore CA1416
52101

53102
// Assert
54103
Assert.False(Core.Options.ShouldUseStatusBarBehaviorOnAndroidModalPage);
55104
Assert.True(Options.ShouldEnableSnackbarOnWindows);
56105
Assert.True(Options.ShouldSuppressExceptionsInAnimations);
57106
Assert.True(Options.ShouldSuppressExceptionsInBehaviors);
58107
Assert.True(Options.ShouldSuppressExceptionsInConverters);
59-
}
60-
}
108+
Assert.False(isAndroidDialogFragmentServiceInitialized);
109+
110+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
111+
112+
void HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted(object? sender, EventArgs e)
113+
{
114+
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted -= HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
115+
isAndroidDialogFragmentServiceInitialized = true;
116+
}
117+
}
118+
}
119+
#pragma warning restore CA1416

0 commit comments

Comments
 (0)