Skip to content

Commit abd8f81

Browse files
committed
2 parents 5ab318e + a23a1ba commit abd8f81

5 files changed

Lines changed: 157 additions & 3 deletions

File tree

src/SimpleRouter.Avalonia/ViewLocatorBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public virtual bool Match(object? data)
5757
/// </summary>
5858
/// <param name="route">The route used to resolve the control.</param>
5959
/// <returns>The resolved control.</returns>
60-
protected abstract Control? ResolveControl(IRoute? route);
60+
public abstract Control? ResolveControl(IRoute? route);
6161

6262
/// <summary>
6363
/// Tries to deduce the control based on the provided data by using reflection.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using Avalonia.Controls;
2+
using Moq;
3+
using SimpleRouter.Avalonia;
4+
5+
namespace SimpleRouter.Tests;
6+
7+
public class AvaloniaRouteViewHostTests
8+
{
9+
[Fact]
10+
public void NavigateToRoute_RouteIsNull_SetsDefaultContent()
11+
{
12+
// Arrange
13+
var routeViewHost = new RouteViewHost();
14+
var defaultContent = new object();
15+
routeViewHost.DefaultContent = defaultContent;
16+
var router = new Mock<IRouter>();
17+
router.Setup(r => r.Current).Returns<IRoute?>(null);
18+
19+
// Act
20+
routeViewHost.Router = router.Object;
21+
22+
// Assert
23+
Assert.Equal(defaultContent, routeViewHost.Content);
24+
}
25+
26+
[Fact]
27+
public void NavigateToRoute_ViewLocatorIsNull_SetsRouteAsContent()
28+
{
29+
// Arrange
30+
var routeViewHost = new RouteViewHost();
31+
var route = new Mock<IRoute>().Object;
32+
var router = new Mock<IRouter>();
33+
router.Setup(r => r.Current).Returns(route);
34+
35+
// Act
36+
routeViewHost.Router = router.Object;
37+
38+
// Assert
39+
Assert.Equal(route, routeViewHost.Content);
40+
}
41+
42+
[Fact]
43+
public void NavigateToRoute_ViewLocatorBuildReturnsNull_SetsDefaultContent()
44+
{
45+
// Arrange
46+
var routeViewHost = new RouteViewHost();
47+
var route = new Mock<IRoute>().Object;
48+
var viewLocator = new Mock<ViewLocatorBase>();
49+
var defaultContent = new object();
50+
var router = new Mock<IRouter>();
51+
router.Setup(r => r.Current).Returns(route);
52+
routeViewHost.ViewLocator = viewLocator.Object;
53+
viewLocator.Setup(v => v.Build(route)).Returns<Control?>(null);
54+
routeViewHost.DefaultContent = defaultContent;
55+
56+
// Act
57+
routeViewHost.Router = router.Object;
58+
59+
// Assert
60+
Assert.Equal(defaultContent, routeViewHost.Content);
61+
}
62+
63+
[Fact]
64+
public void NavigateToRoute_ViewLocatorBuildReturnsView_SetsViewAsContent()
65+
{
66+
// Arrange
67+
var routeViewHost = new RouteViewHost();
68+
var route = new Mock<IRoute>().Object;
69+
var view = new Mock<Control>().Object;
70+
var viewLocator = new Mock<ViewLocatorBase>();
71+
routeViewHost.ViewLocator = viewLocator.Object;
72+
viewLocator.Setup(v => v.Build(route)).Returns(view);
73+
var router = new Mock<IRouter>();
74+
router.Setup(r => r.Current).Returns(route);
75+
76+
// Act
77+
routeViewHost.Router = router.Object;
78+
79+
// Assert
80+
Assert.Equal(view, routeViewHost.Content);
81+
Assert.Equal(route, view.DataContext);
82+
}
83+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using Avalonia.Controls;
2+
using Moq;
3+
using SimpleRouter.Avalonia;
4+
5+
namespace SimpleRouter.Tests;
6+
7+
public class AvaloniaViewLocatorTests
8+
{
9+
[Fact]
10+
public void Build_WithNullParameter_ReturnsDefaultContent()
11+
{
12+
// Arrange
13+
var viewLocator = new Mock<ViewLocatorBase>() { CallBase = true };
14+
var defaultContent = new Control();
15+
viewLocator.Object.DefaultContent = defaultContent;
16+
17+
// Act
18+
var result = viewLocator.Object.Build(null);
19+
20+
// Assert
21+
Assert.Equal(defaultContent, result);
22+
}
23+
24+
[Fact]
25+
public void Build_WithNonNullParameter_ResolvesControl()
26+
{
27+
// Arrange
28+
var viewLocator = new Mock<ViewLocatorBase>() { CallBase = true };
29+
var route = new Mock<IRoute>();
30+
var resolvedControl = new Control();
31+
viewLocator.Object.DefaultContent = new Control();
32+
viewLocator.Setup(x => x.ResolveControl(route.Object)).Returns(resolvedControl);
33+
34+
// Act
35+
var result = viewLocator.Object.Build(route.Object);
36+
37+
// Assert
38+
Assert.Equal(resolvedControl, result);
39+
}
40+
41+
[Fact]
42+
public void Match_WithDataOfTypeIRoute_ReturnsTrue()
43+
{
44+
// Arrange
45+
var viewLocator = new Mock<ViewLocatorBase>() { CallBase = true }.Object;
46+
var data = new Mock<IRoute>().Object;
47+
48+
// Act
49+
var result = viewLocator.Match(data);
50+
51+
// Assert
52+
Assert.True(result);
53+
}
54+
55+
[Fact]
56+
public void Match_WithDataNotOfTypeIRoute_ReturnsFalse()
57+
{
58+
// Arrange
59+
var viewLocator = new Mock<ViewLocatorBase>() { CallBase = true }.Object;
60+
var data = new object();
61+
62+
// Act
63+
var result = viewLocator.Match(data);
64+
65+
// Assert
66+
Assert.False(result);
67+
}
68+
69+
70+
}

src/SimpleRouter.Tests/SimpleRouter.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
</ItemGroup>
2525

2626
<ItemGroup>
27+
<ProjectReference Include="..\SimpleRouter.Avalonia\SimpleRouter.Avalonia.csproj" />
2728
<ProjectReference Include="..\SimpleRouter\SimpleRouter.csproj" />
2829
</ItemGroup>
2930

src/samples/Avalonia/SimpleRouter.Avalonia.Demo/ViewLocator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public override bool Match(object? data)
1414
return data is ViewModelBase;
1515
}
1616

17-
protected override Control? ResolveControl(IRoute? route)
17+
public override Control? ResolveControl(IRoute? route)
1818
{
1919
ArgumentNullException.ThrowIfNull(route);
2020
return route switch
@@ -39,7 +39,7 @@ public override bool Match(object? data)
3939
return data is ViewModelBase;
4040
}
4141

42-
protected override Control? ResolveControl(IRoute? route)
42+
public override Control? ResolveControl(IRoute? route)
4343
{
4444
ArgumentNullException.ThrowIfNull(route);
4545
return route switch

0 commit comments

Comments
 (0)