Skip to content

Commit

Permalink
Fix more unit tests and samples
Browse files Browse the repository at this point in the history
  • Loading branch information
Eilon committed Aug 16, 2021
1 parent 514eb28 commit 7504f56
Show file tree
Hide file tree
Showing 20 changed files with 252 additions and 324 deletions.
8 changes: 7 additions & 1 deletion src/Compatibility/Core/src/AppHostBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,13 @@ public static MauiAppBuilder UseMauiApp<TApp>(this MauiAppBuilder builder)
return builder;
}


public static MauiAppBuilder UseMauiApp<TApp>(this MauiAppBuilder builder, Func<IServiceProvider, TApp> implementationFactory)
where TApp : class, IApplication
{
builder.Services.AddSingleton<IApplication>(implementationFactory);
builder.SetupDefaults();
return builder;
}

static MauiAppBuilder SetupDefaults(this MauiAppBuilder builder)
{
Expand Down
19 changes: 7 additions & 12 deletions src/Controls/tests/Core.UnitTests/HostBuilderAppTests.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Core;
using Microsoft.Maui.Controls.Hosting;
using Microsoft.Maui.Handlers;
using Microsoft.Maui.Hosting;
using NUnit;
using NUnit.Framework;

namespace Microsoft.Maui.Controls.Core.UnitTests
Expand All @@ -15,34 +10,34 @@ public class HostBuilderAppTests
[Test]
public void UseMauiAppRegistersApp()
{
var host = new AppHostBuilder()
var serviceProvider = MauiAppBuilder.CreateBuilder()
.UseMauiApp<ApplicationStub>()
.Build();

var app = (ApplicationStub)host.Services.GetRequiredService<IApplication>();
var app = (ApplicationStub)serviceProvider.GetRequiredService<IApplication>();
Assert.AreEqual("Default", app.Property);
}

[Test]
public void UseMauiAppRegistersAppWithFactory()
{
var host = new AppHostBuilder()
var serviceProvider = MauiAppBuilder.CreateBuilder()
.UseMauiApp(services => new ApplicationStub { Property = "Factory" })
.Build();

var app = (ApplicationStub)host.Services.GetRequiredService<IApplication>();
var app = (ApplicationStub)serviceProvider.GetRequiredService<IApplication>();
Assert.AreEqual("Factory", app.Property);
}

[Test]
public void UseMauiAppRegistersSingleton()
{
var host = new AppHostBuilder()
var serviceProvider = MauiAppBuilder.CreateBuilder()
.UseMauiApp<ApplicationStub>()
.Build();

var app1 = host.Services.GetRequiredService<IApplication>();
var app2 = host.Services.GetRequiredService<IApplication>();
var app1 = serviceProvider.GetRequiredService<IApplication>();
var app2 = serviceProvider.GetRequiredService<IApplication>();

Assert.AreEqual(app1, app2);
}
Expand Down
20 changes: 12 additions & 8 deletions src/Controls/tests/Core.UnitTests/HostBuilderHandlerTests.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Core;
using Microsoft.Maui.Controls.Hosting;
using Microsoft.Maui.Handlers;
using Microsoft.Maui.Hosting;
using NUnit;
using NUnit.Framework;

namespace Microsoft.Maui.Controls.Core.UnitTests
Expand All @@ -15,11 +12,14 @@ public class HostBuilderHandlerTests
[Test]
public void DefaultHandlersAreRegistered()
{
var host = new AppHostBuilder()
var services = MauiAppBuilder.CreateBuilder()
.UseMauiApp<ApplicationStub>()
.Build();

var handler = host.Handlers.GetHandler(typeof(Button));
Assert.NotNull(services);
var handlers = services.GetRequiredService<IMauiHandlersServiceProvider>();
Assert.NotNull(handlers);
var handler = handlers.GetHandler(typeof(Button));

Assert.NotNull(handler);
Assert.AreEqual(handler.GetType(), typeof(ButtonHandler));
Expand All @@ -28,12 +28,16 @@ public void DefaultHandlersAreRegistered()
[Test]
public void CanSpecifyHandler()
{
var host = new AppHostBuilder()
var services = MauiAppBuilder.CreateBuilder()
.UseMauiApp<ApplicationStub>()
.ConfigureMauiHandlers((_, handlers) => handlers.AddHandler<Button, ButtonHandlerStub>())
.ConfigureMauiHandlers(handlers => handlers.AddHandler<Button, ButtonHandlerStub>())
.Build();

var specificHandler = host.Handlers.GetHandler(typeof(Button));
Assert.NotNull(services);
var handlers = services.GetRequiredService<IMauiHandlersServiceProvider>();
Assert.NotNull(handlers);

var specificHandler = handlers.GetHandler(typeof(Button));

Assert.NotNull(specificHandler);
Assert.AreEqual(specificHandler.GetType(), typeof(ButtonHandlerStub));
Expand Down
1 change: 0 additions & 1 deletion src/Core/src/Core/MauiAppBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
Expand Down
101 changes: 40 additions & 61 deletions src/Core/tests/Benchmarks/Benchmarks/MauiServiceProviderBenchmarker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,111 +2,90 @@
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Maui.Hosting;

namespace Microsoft.Maui.Handlers.Benchmarks
{
[MemoryDiagnoser]
public class MauiServiceProviderBenchmarker
{
IAppHost _host;
IServiceProvider _serviceProvider;

[Params(100_000)]
public int N { get; set; }

[IterationSetup(Target = nameof(DefaultBuilder))]
public void SetupForDefaultBuilder()
{
_host = AppHost
.CreateDefaultBuilder()
.ConfigureServices((ctx, svc) => svc.AddTransient<IFooService, FooService>())
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();

appBuilder.Services.AddTransient<IFooService, FooService>();

_serviceProvider = appBuilder.Build();
}

[IterationSetup(Target = nameof(DefaultBuilderWithConstructorInjection))]
public void SetupForDefaultBuilderWithConstructorInjection()
{
_host = AppHost
.CreateDefaultBuilder()
.UseMauiServiceProviderFactory(true)
.ConfigureServices((ctx, svc) => svc.AddTransient<IFooService, FooService>())
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();
//.UseMauiServiceProviderFactory(true)
appBuilder.Services.AddTransient<IFooService, FooService>();
_serviceProvider = appBuilder.Build();
}

[IterationSetup(Target = nameof(OneConstructorParameter))]
public void SetupForOneConstructorParameter()
{
_host = AppHost
.CreateDefaultBuilder()
.UseMauiServiceProviderFactory(true)
.ConfigureServices((ctx, svc) =>
{
svc.AddTransient<IFooService, FooService>();
svc.AddTransient<IFooBarService, FooBarWithFooService>();
})
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();
//.UseMauiServiceProviderFactory(true)
appBuilder.Services.AddTransient<IFooService, FooService>();
appBuilder.Services.AddTransient<IFooBarService, FooBarWithFooService>();
_serviceProvider = appBuilder.Build();
}

[IterationSetup(Target = nameof(TwoConstructorParameters))]
public void SetupForTwoConstructorParameters()
{
_host = AppHost
.CreateDefaultBuilder()
.UseMauiServiceProviderFactory(true)
.ConfigureServices((ctx, svc) =>
{
svc.AddTransient<IFooService, FooService>();
svc.AddTransient<IBarService, BarService>();
svc.AddTransient<IFooBarService, FooBarWithFooAndBarService>();
})
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();
//.UseMauiServiceProviderFactory(true)
appBuilder.Services.AddTransient<IFooService, FooService>();
appBuilder.Services.AddTransient<IBarService, BarService>();
appBuilder.Services.AddTransient<IFooBarService, FooBarWithFooAndBarService>();
_serviceProvider = appBuilder.Build();
}

[IterationSetup(Target = nameof(ExtensionsWithConstructorInjection))]
public void SetupForExtensionsWithConstructorInjection()
{
_host = AppHost
.CreateDefaultBuilder()
.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory())
.ConfigureServices((ctx, svc) => svc.AddTransient<IFooService, FooService>())
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();
appBuilder.Services.AddTransient<IFooService, FooService>();
_serviceProvider = appBuilder.Build();
}

[IterationSetup(Target = nameof(ExtensionsWithOneConstructorParameter))]
public void SetupForExtensionsWithOneConstructorParameter()
{
_host = AppHost
.CreateDefaultBuilder()
.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory())
.ConfigureServices((ctx, svc) =>
{
svc.AddTransient<IFooService, FooService>();
svc.AddTransient<IFooBarService, FooBarWithFooService>();
})
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();
appBuilder.Services.AddTransient<IFooService, FooService>();
appBuilder.Services.AddTransient<IFooBarService, FooBarWithFooService>();
_serviceProvider = appBuilder.Build();
}

[IterationSetup(Target = nameof(ExtensionsWithTwoConstructorParameters))]
public void SetupForExtensionsWithTwoConstructorParameters()
{
_host = AppHost
.CreateDefaultBuilder()
.UseServiceProviderFactory(new DIExtensionsServiceProviderFactory())
.ConfigureServices((ctx, svc) =>
{
svc.AddTransient<IFooService, FooService>();
svc.AddTransient<IBarService, BarService>();
svc.AddTransient<IFooBarService, FooBarWithFooAndBarService>();
})
.Build();
var appBuilder = MauiAppBuilder.CreateBuilder();
appBuilder.Services.AddTransient<IFooService, FooService>();
appBuilder.Services.AddTransient<IBarService, BarService>();
appBuilder.Services.AddTransient<IFooBarService, FooBarWithFooAndBarService>();
_serviceProvider = appBuilder.Build();
}

[Benchmark(Baseline = true)]
public void DefaultBuilder()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooService>();
_serviceProvider.GetService<IFooService>();
}
}

Expand All @@ -115,7 +94,7 @@ public void DefaultBuilderWithConstructorInjection()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooService>();
_serviceProvider.GetService<IFooService>();
}
}

Expand All @@ -124,7 +103,7 @@ public void OneConstructorParameter()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooBarService>();
_serviceProvider.GetService<IFooBarService>();
}
}

Expand All @@ -133,7 +112,7 @@ public void TwoConstructorParameters()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooBarService>();
_serviceProvider.GetService<IFooBarService>();
}
}

Expand All @@ -142,7 +121,7 @@ public void ExtensionsWithConstructorInjection()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooService>();
_serviceProvider.GetService<IFooService>();
}
}

Expand All @@ -151,7 +130,7 @@ public void ExtensionsWithOneConstructorParameter()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooBarService>();
_serviceProvider.GetService<IFooBarService>();
}
}

Expand All @@ -160,7 +139,7 @@ public void ExtensionsWithTwoConstructorParameters()
{
for (int i = 0; i < N; i++)
{
_host.Services.GetService<IFooBarService>();
_serviceProvider.GetService<IFooBarService>();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Microsoft.Maui.Handlers.Benchmarks
[MemoryDiagnoser]
public class RegisterHandlersBenchmarker
{
IAppHostBuilder _builder;
MauiAppBuilder _builder;

Registrar<IView, IViewHandler> _registrar;

Expand All @@ -16,7 +16,7 @@ public class RegisterHandlersBenchmarker
[IterationSetup(Target = nameof(RegisterHandlerUsingDI))]
public void SetupForDI()
{
_builder = new AppHostBuilder();
_builder = MauiAppBuilder.CreateBuilder();
}

[IterationSetup(Target = nameof(RegisterHandlerUsingRegistrar))]
Expand All @@ -30,7 +30,7 @@ public void RegisterHandlerUsingDI()
{
for (int i = 0; i < N; i++)
{
_builder.ConfigureMauiHandlers((_, handlers) => handlers.AddHandler<IButton, ButtonHandler>());
_builder.ConfigureMauiHandlers(handlers => handlers.AddHandler<IButton, ButtonHandler>());
}
}

Expand Down
17 changes: 8 additions & 9 deletions src/Core/tests/DeviceTests/Handlers/HandlerTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,23 @@ public partial class HandlerTestBase<THandler, TStub> : TestBase, IDisposable
where TStub : StubBase, IView, new()
{
IApplication _app;
IAppHost _host;
IServiceProvider _servicesProvider;
IMauiContext _context;

public HandlerTestBase()
{
var appBuilder = AppHost
.CreateDefaultBuilder()
var appBuilder = MauiAppBuilder
.CreateBuilder()
.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler(typeof(SliderStub), typeof(SliderHandler));
handlers.AddHandler(typeof(ButtonStub), typeof(ButtonHandler));
})
.ConfigureImageSources((ctx, services) =>
.ConfigureImageSources(services =>
{
services.AddService<ICountedImageSourceStub, CountedImageSourceServiceStub>();
})
.ConfigureFonts((ctx, fonts) =>
.ConfigureFonts(fonts =>
{
fonts.AddFont("dokdo_regular.ttf", "Dokdo");
fonts.AddFont("LobsterTwo-Regular.ttf", "Lobster Two");
Expand All @@ -38,17 +38,16 @@ public HandlerTestBase()
fonts.AddFont("LobsterTwo-BoldItalic.ttf", "Lobster Two BoldItalic");
});

_host = appBuilder.Build();
_servicesProvider = appBuilder.Build();

_app = new ApplicationStub();

_context = new ContextStub(_host.Services);
_context = new ContextStub(_servicesProvider);
}

public void Dispose()
{
_host.Dispose();
_host = null;
_servicesProvider = null;
_app = null;
_context = null;
}
Expand Down
Loading

0 comments on commit 7504f56

Please sign in to comment.