Skip to content

Commit

Permalink
feature: Added RegisterViewForNavigation method (#398)
Browse files Browse the repository at this point in the history
* feature: Added RegisterViewForNavigation method

* fixed test

* fixing api approval
  • Loading branch information
RLittlesII authored May 19, 2021
1 parent 8ce5e36 commit 87a6779
Show file tree
Hide file tree
Showing 6 changed files with 213 additions and 30 deletions.
8 changes: 8 additions & 0 deletions src/Sextant.Mocks/NavigableViewModelMock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ public NavigableViewModelMock(string? id = null)
_navigatingTo = new Subject<Unit>();
}

/// <summary>
/// Initializes a new instance of the <see cref="NavigableViewModelMock"/> class.
/// </summary>
public NavigableViewModelMock()
: this(string.Empty)
{
}

/// <summary>
/// Gets the ID of the page.
/// </summary>
Expand Down
13 changes: 11 additions & 2 deletions src/Sextant.Tests/API/ApiApprovalTests.Sextant.net5.0.approved.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,21 @@ namespace Sextant
{
public static string NavigationView { get; }
public static Splat.IMutableDependencyResolver RegisterParameterViewStackService(this Splat.IMutableDependencyResolver dependencyResolver) { }
[System.Obsolete("Use RegisterViewForNavigation")]
public static Splat.IMutableDependencyResolver RegisterView<TView, TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, string? contract = null)
where TView : ReactiveUI.IViewFor<TViewModel>, new ()
where TViewModel : class, Sextant.IViewModel { }
public static Splat.IMutableDependencyResolver RegisterView<TView, TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, System.Func<ReactiveUI.IViewFor<TViewModel>> viewFactory, string? contract = null)
where TView : ReactiveUI.IViewFor
[System.Obsolete("Use RegisterViewForNavigation")]
public static Splat.IMutableDependencyResolver RegisterView<TView, TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, System.Func<TView> viewFactory, string? contract = null)
where TView : class, ReactiveUI.IViewFor
where TViewModel : class, Sextant.IViewModel { }
public static Splat.IMutableDependencyResolver RegisterViewForNavigation<TView, TViewModel>(this Splat.IMutableDependencyResolver resolver, System.Func<TView> viewFactory, System.Func<TViewModel> viewModelFactory)
where TView : class, ReactiveUI.IViewFor<TViewModel>
where TViewModel : class, Sextant.IViewModel { }
public static Splat.IMutableDependencyResolver RegisterViewForNavigation<TView, TViewModel>(this Splat.IMutableDependencyResolver resolver, TView view, TViewModel viewModel)
where TView : class, ReactiveUI.IViewFor<TViewModel>
where TViewModel : class, Sextant.IViewModel { }
[System.Obsolete("Use of new makes this method undesirable.")]
public static Splat.IMutableDependencyResolver RegisterViewModel<TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, string? contract = null)
where TViewModel : Sextant.IViewModel, new () { }
public static Splat.IMutableDependencyResolver RegisterViewModel<TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, System.Func<TViewModel> viewModelFactory, string? contract = null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,21 @@ namespace Sextant
{
public static string NavigationView { get; }
public static Splat.IMutableDependencyResolver RegisterParameterViewStackService(this Splat.IMutableDependencyResolver dependencyResolver) { }
[System.Obsolete("Use RegisterViewForNavigation")]
public static Splat.IMutableDependencyResolver RegisterView<TView, TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, string? contract = null)
where TView : ReactiveUI.IViewFor<TViewModel>, new ()
where TViewModel : class, Sextant.IViewModel { }
public static Splat.IMutableDependencyResolver RegisterView<TView, TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, System.Func<ReactiveUI.IViewFor<TViewModel>> viewFactory, string? contract = null)
where TView : ReactiveUI.IViewFor
[System.Obsolete("Use RegisterViewForNavigation")]
public static Splat.IMutableDependencyResolver RegisterView<TView, TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, System.Func<TView> viewFactory, string? contract = null)
where TView : class, ReactiveUI.IViewFor
where TViewModel : class, Sextant.IViewModel { }
public static Splat.IMutableDependencyResolver RegisterViewForNavigation<TView, TViewModel>(this Splat.IMutableDependencyResolver resolver, System.Func<TView> viewFactory, System.Func<TViewModel> viewModelFactory)
where TView : class, ReactiveUI.IViewFor<TViewModel>
where TViewModel : class, Sextant.IViewModel { }
public static Splat.IMutableDependencyResolver RegisterViewForNavigation<TView, TViewModel>(this Splat.IMutableDependencyResolver resolver, TView view, TViewModel viewModel)
where TView : class, ReactiveUI.IViewFor<TViewModel>
where TViewModel : class, Sextant.IViewModel { }
[System.Obsolete("Use of new makes this method undesirable.")]
public static Splat.IMutableDependencyResolver RegisterViewModel<TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, string? contract = null)
where TViewModel : Sextant.IViewModel, new () { }
public static Splat.IMutableDependencyResolver RegisterViewModel<TViewModel>(this Splat.IMutableDependencyResolver dependencyResolver, System.Func<TViewModel> viewModelFactory, string? contract = null)
Expand Down
70 changes: 70 additions & 0 deletions src/Sextant.Tests/DependencyResolverMixinTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,75 @@ public void Should_Register_View_Factory()
result.Should().BeOfType<PageView>();
}
}

/// <summary>
/// Tests the register view for navigation method.
/// </summary>
public sealed class TheRegisterViewForNavigationMethod
{
/// <summary>
/// Should register the view for navigation.
/// </summary>
[Fact]
public void Should_Register_View_Factory_For_Navigation()
{
// Given
Locator.CurrentMutable.RegisterViewForNavigation(() => new PageView(), () => new NavigableViewModelMock());

// When
var result = Locator.Current.GetService<IViewFor<NavigableViewModelMock>>();

// Then
result.Should().BeOfType<PageView>();
}

/// <summary>
/// Should register the view for navigation.
/// </summary>
[Fact]
public void Should_Register_ViewModel_Factory_For_Navigation()
{
// Given
Locator.CurrentMutable.RegisterViewForNavigation(() => new PageView(), () => new NavigableViewModelMock());

// When
var result = Locator.Current.GetService<NavigableViewModelMock>();

// Then
result.Should().NotBeNull();
}

/// <summary>
/// Should register the view for navigation.
/// </summary>
[Fact]
public void Should_Register_View_For_Navigation()
{
// Given
Locator.CurrentMutable.RegisterViewForNavigation(new PageView(), new NavigableViewModelMock());

// When
var result = Locator.Current.GetService<IViewFor<NavigableViewModelMock>>();

// Then
result.Should().BeOfType<PageView>();
}

/// <summary>
/// Should register the view for navigation.
/// </summary>
[Fact]
public void Should_Register_ViewModel_For_Navigation()
{
// Given
Locator.CurrentMutable.RegisterViewForNavigation(() => new PageView(), () => new NavigableViewModelMock());

// When
var result = Locator.Current.GetService<NavigableViewModelMock>();

// Then
result.Should().NotBeNull();
}
}
}
}
96 changes: 72 additions & 24 deletions src/Sextant.Tests/Navigation/NavigationParameterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,41 +15,89 @@ namespace Sextant.Tests
public class NavigationParameterTests
{
/// <summary>
/// Tests the method gets a value.
/// Tests the get value method.
/// </summary>
[Fact]
public void Should_Get_Value()
public sealed class TheGetValueMethod
{
// Given
NavigationParameter sut = new();
sut.Add("key", TimeSpan.Zero);
/// <summary>
/// Tests the method gets a value.
/// </summary>
[Fact]
public void Should_Get_Value()
{
// Given
NavigationParameter sut = new();
sut.Add("key", TimeSpan.Zero);

// When
var result = sut.GetValue<TimeSpan>("key");
// When
var result = sut.GetValue<TimeSpan>("key");

// Then
result
.Should()
.Be(TimeSpan.Zero);
// Then
result
.Should()
.Be(TimeSpan.Zero);
}

/// <summary>
/// Tests the method gets a value.
/// </summary>
[Fact]
public void Should_Get_Default_Value()
{
// Given
NavigationParameter sut = new();

// When
var result = sut.GetValue<TimeSpan>("key");

// Then
result
.Should()
.Be(TimeSpan.Zero);
}
}

/// <summary>
/// Tests the method tries to gets a value.
/// Test the try get value method.
/// </summary>
[Fact]
public void Should_Try_Get_Value()
public sealed class TheTryGetValueMethod
{
// Given
NavigationParameter sut = new();
sut.Add("key", TimeSpan.Zero);
/// <summary>
/// Tests the method tries to gets a value.
/// </summary>
[Fact]
public void Should_Try_Get_Value()
{
// Given
NavigationParameter sut = new();
sut.Add("key", TimeSpan.Zero);

// When
var result = sut.TryGetValue<TimeSpan>("key", out var value);

// Then
result
.Should()
.BeTrue();
}

/// <summary>
/// Tests the method tries to gets a value.
/// </summary>
[Fact]
public void Should_Not_Try_Get_Value()
{
// Given
NavigationParameter sut = new();

// When
var result = sut.TryGetValue<TimeSpan>("key", out var value);
// When
var result = sut.TryGetValue<TimeSpan>("key", out var value);

// Then
result
.Should()
.BeTrue();
// Then
result
.Should()
.BeFalse();
}
}
}
}
43 changes: 41 additions & 2 deletions src/Sextant/DependencyResolverMixins.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ public static IMutableDependencyResolver RegisterViewModelFactory(this IMutableD
/// <param name="dependencyResolver">The dependency resolver.</param>
/// <param name="contract">The contract.</param>
/// <returns>The dependency resolver to use.</returns>
[Obsolete("Use RegisterViewForNavigation")]
public static IMutableDependencyResolver RegisterView<TView, TViewModel>(this IMutableDependencyResolver dependencyResolver, string? contract = null)
where TView : IViewFor<TViewModel>, new()
where TViewModel : class, IViewModel
Expand All @@ -183,8 +184,9 @@ public static IMutableDependencyResolver RegisterView<TView, TViewModel>(this IM
/// <param name="viewFactory">The view factory.</param>
/// <param name="contract">The contract.</param>
/// <returns>The dependencyResolver.</returns>
public static IMutableDependencyResolver RegisterView<TView, TViewModel>(this IMutableDependencyResolver dependencyResolver, Func<IViewFor<TViewModel>> viewFactory, string? contract = null)
where TView : IViewFor
[Obsolete("Use RegisterViewForNavigation")]
public static IMutableDependencyResolver RegisterView<TView, TViewModel>(this IMutableDependencyResolver dependencyResolver, Func<TView> viewFactory, string? contract = null)
where TView : class, IViewFor
where TViewModel : class, IViewModel
{
if (dependencyResolver is null)
Expand All @@ -208,6 +210,7 @@ public static IMutableDependencyResolver RegisterView<TView, TViewModel>(this IM
/// <param name="dependencyResolver">The dependency resolver.</param>
/// <param name="contract">The contract.</param>
/// <returns>The dependencyResolver.</returns>
[Obsolete("Use of new makes this method undesirable.")]
public static IMutableDependencyResolver RegisterViewModel<TViewModel>(this IMutableDependencyResolver dependencyResolver, string? contract = null)
where TViewModel : IViewModel, new()
{
Expand Down Expand Up @@ -269,5 +272,41 @@ public static IMutableDependencyResolver RegisterViewModel<TViewModel>(this IMut
dependencyResolver.Register(() => viewModel, typeof(TViewModel), contract);
return dependencyResolver;
}

/// <summary>
/// Registers the provided <see cref="IViewFor{T}"/> to the <see cref="TViewModel"/> for navigation.
/// </summary>
/// <param name="resolver">The resolver.</param>
/// <param name="viewFactory">The view factory.</param>
/// <param name="viewModelFactory">The view model factory.</param>
/// <typeparam name="TView">The view.</typeparam>
/// <typeparam name="TViewModel">The view model.</typeparam>
/// <returns>The dependency resolver.</returns>
public static IMutableDependencyResolver RegisterViewForNavigation<TView, TViewModel>(this IMutableDependencyResolver resolver, Func<TView> viewFactory, Func<TViewModel> viewModelFactory)
where TView : class, IViewFor<TViewModel>
where TViewModel : class, IViewModel
{
resolver.Register(viewFactory, typeof(IViewFor<TViewModel>));
resolver.Register(viewModelFactory, typeof(TViewModel));
return resolver;
}

/// <summary>
/// Registers the provided <see cref="IViewFor{T}"/> to the <see cref="TViewModel"/> for navigation.
/// </summary>
/// <param name="resolver">The resolver.</param>
/// <param name="view">The view factory.</param>
/// <param name="viewModel">The view model factory.</param>
/// <typeparam name="TView">The view.</typeparam>
/// <typeparam name="TViewModel">The view model.</typeparam>
/// <returns>The dependency resolver.</returns>
public static IMutableDependencyResolver RegisterViewForNavigation<TView, TViewModel>(this IMutableDependencyResolver resolver, TView view, TViewModel viewModel)
where TView : class, IViewFor<TViewModel>
where TViewModel : class, IViewModel
{
resolver.Register(() => view, typeof(IViewFor<TViewModel>));
resolver.Register(() => viewModel, typeof(TViewModel));
return resolver;
}
}
}

0 comments on commit 87a6779

Please sign in to comment.