diff --git a/Source/Xamarin/Prism.DI.Forms.Tests/Fixtures/PrismApplicationFixture.cs b/Source/Xamarin/Prism.DI.Forms.Tests/Fixtures/PrismApplicationFixture.cs index dc6c5ce08..a835b3663 100644 --- a/Source/Xamarin/Prism.DI.Forms.Tests/Fixtures/PrismApplicationFixture.cs +++ b/Source/Xamarin/Prism.DI.Forms.Tests/Fixtures/PrismApplicationFixture.cs @@ -25,6 +25,7 @@ using Prism.Navigation; using Prism.Services; using Xamarin.Forms; +using Xamarin.Forms.Mocks; using Xunit; using Xunit.Abstractions; @@ -143,6 +144,40 @@ public async Task Navigate_UnregisteredView_ThrowException() Assert.Contains("missing", result.Exception.ToString(), StringComparison.OrdinalIgnoreCase); } + [Theory] + [InlineData(typeof(AutowireView), TargetIdiom.Unsupported)] + [InlineData(typeof(AutowireViewTablet), TargetIdiom.Tablet)] + public async Task NavigationUses_IdiomSpecificView(Type viewType, TargetIdiom idiom) + { + Device.SetIdiom(idiom); + var initializer = new XunitPlatformInitializer(_testOutputHelper); + var app = new PrismApplicationMockPlatformAware(initializer); + + Assert.True(app.Initialized); + await app.NavigationService.NavigateAsync("AutowireView"); + Assert.IsType(viewType, app.MainPage); + Assert.IsType(app.MainPage.BindingContext); + + Device.SetIdiom(TargetIdiom.Unsupported); + } + + [Theory] + [InlineData(typeof(ViewAMock), "Test")] + [InlineData(typeof(ViewAMockAndroid), Device.Android)] + public async Task NavigationUses_PlatformSpecificView(Type viewType, string runtimePlatform) + { + MockForms.UpdateRuntimePlatform(runtimePlatform); + var initializer = new XunitPlatformInitializer(_testOutputHelper); + var app = new PrismApplicationMockPlatformAware(initializer); + + Assert.True(app.Initialized); + await app.NavigationService.NavigateAsync("ViewAMock"); + Assert.IsType(viewType, app.MainPage); + Assert.IsType(app.MainPage.BindingContext); + + MockForms.UpdateRuntimePlatform("Test"); + } + [Fact] public async Task Navigate_Key() { diff --git a/Source/Xamarin/Prism.DI.Forms.Tests/MockForms.cs b/Source/Xamarin/Prism.DI.Forms.Tests/MockForms.cs index 1689e1b21..85b493395 100644 --- a/Source/Xamarin/Prism.DI.Forms.Tests/MockForms.cs +++ b/Source/Xamarin/Prism.DI.Forms.Tests/MockForms.cs @@ -27,6 +27,11 @@ public static void Init(string runtimePlatform = "Test") OpenUriAction = null; } + public static void UpdateRuntimePlatform(string runtimePlatform) + { + Device.PlatformServices = new PlatformServices(runtimePlatform); + } + private class PlatformServices : IPlatformServices { public PlatformServices(string runtimePlatform) diff --git a/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/PrismApplicationMockPlatformAware.cs b/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/PrismApplicationMockPlatformAware.cs new file mode 100644 index 000000000..611c17946 --- /dev/null +++ b/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/PrismApplicationMockPlatformAware.cs @@ -0,0 +1,51 @@ +using Prism.DI.Forms.Tests.Mocks.Modules; +using Prism.DI.Forms.Tests.Mocks.Services; +using Prism.DI.Forms.Tests.Mocks.ViewModels; +using Prism.DI.Forms.Tests.Mocks.Views; +using Prism.Ioc; +using Prism.Modularity; +using Prism.Navigation; +using Xamarin.Forms; +using Prism.Logging; +using Prism.Forms.Tests.Mocks.Logging; +using Prism.Mvvm; +#if Autofac +using Prism.Autofac; +using Autofac; +#elif DryIoc +using Prism.DryIoc; +using DryIoc; +#elif Ninject +using Prism.Ninject; +using Ninject; +#elif Unity +using Prism.Unity; +using Unity; +#endif + +namespace Prism.DI.Forms.Tests +{ + public class PrismApplicationMockPlatformAware : PrismApplicationMock + { + public PrismApplicationMockPlatformAware(IPlatformInitializer platformInitializer) + : base(platformInitializer) + { + } + + public PrismApplicationMockPlatformAware(IPlatformInitializer platformInitializer, Page startPage) + : base(platformInitializer, startPage) + { + } + + protected override void RegisterTypes(IContainerRegistry containerRegistry) + { + containerRegistry.RegisterForNavigation(); + + containerRegistry.RegisterForNavigationOnIdiom(tabletView: typeof(AutowireViewTablet)); + containerRegistry.RegisterForNavigationOnPlatform(new Platform(AppModel.RuntimePlatform.Android)); + + DependencyService.Register(); + ViewModelLocationProvider.Register(); + } + } +} \ No newline at end of file diff --git a/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/Views/AutowireViewTablet.cs b/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/Views/AutowireViewTablet.cs new file mode 100644 index 000000000..e7f8b2b8f --- /dev/null +++ b/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/Views/AutowireViewTablet.cs @@ -0,0 +1,13 @@ +using Prism.Mvvm; +using Xamarin.Forms; + +namespace Prism.DI.Forms.Tests.Mocks.Views +{ + public class AutowireViewTablet : Page + { + public AutowireViewTablet() + { + ViewModelLocator.SetAutowireViewModel(this, true); + } + } +} \ No newline at end of file diff --git a/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/Views/ViewAMockAndroid.cs b/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/Views/ViewAMockAndroid.cs new file mode 100644 index 000000000..35f65e1b6 --- /dev/null +++ b/Source/Xamarin/Prism.DI.Forms.Tests/Mocks/Views/ViewAMockAndroid.cs @@ -0,0 +1,13 @@ +using Prism.Mvvm; +using Xamarin.Forms; + +namespace Prism.DI.Forms.Tests.Mocks.Views +{ + public class ViewAMockAndroid : Page + { + public ViewAMockAndroid() + { + ViewModelLocator.SetAutowireViewModel(this, true); + } + } +} \ No newline at end of file