Skip to content

Commit 5800ef9

Browse files
committed
Fix WarmupAssemblyViewModels issue.
1 parent 37bac53 commit 5800ef9

File tree

7 files changed

+100
-3
lines changed

7 files changed

+100
-3
lines changed

src/UnityMvvmToolkit.Core/BindingContextObjectProvider.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public BindingContextObjectProvider(IValueConverter[] converters,
3333
public IObjectProvider WarmupAssemblyViewModels()
3434
{
3535
var assemblyTypes = Assembly
36-
.GetExecutingAssembly()
36+
.GetCallingAssembly()
3737
.GetTypes()
3838
.Where(type => type.IsInterface == false && type.IsAbstract == false &&
3939
typeof(IBindingContext).IsAssignableFrom(type));
@@ -53,6 +53,12 @@ public IObjectProvider WarmupViewModel<TBindingContext>() where TBindingContext
5353

5454
public IObjectProvider WarmupViewModel(Type bindingContextType)
5555
{
56+
if (bindingContextType.IsInterface || bindingContextType.IsAbstract ||
57+
typeof(IBindingContext).IsAssignableFrom(bindingContextType) == false)
58+
{
59+
throw new InvalidOperationException($"Can not warmup {bindingContextType.Name}.");
60+
}
61+
5662
if (_bindingContextHandler.TryRegisterBindingContext(bindingContextType) == false)
5763
{
5864
throw new InvalidOperationException($"{bindingContextType.Name} already warmed up.");

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/BindingContextObjectProvider.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public BindingContextObjectProvider(IValueConverter[] converters,
3333
public IObjectProvider WarmupAssemblyViewModels()
3434
{
3535
var assemblyTypes = Assembly
36-
.GetExecutingAssembly()
36+
.GetCallingAssembly()
3737
.GetTypes()
3838
.Where(type => type.IsInterface == false && type.IsAbstract == false &&
3939
typeof(IBindingContext).IsAssignableFrom(type));
@@ -53,6 +53,12 @@ public IObjectProvider WarmupViewModel<TBindingContext>() where TBindingContext
5353

5454
public IObjectProvider WarmupViewModel(Type bindingContextType)
5555
{
56+
if (bindingContextType.IsInterface || bindingContextType.IsAbstract ||
57+
typeof(IBindingContext).IsAssignableFrom(bindingContextType) == false)
58+
{
59+
throw new InvalidOperationException($"Can not warmup {bindingContextType.Name}.");
60+
}
61+
5662
if (_bindingContextHandler.TryRegisterBindingContext(bindingContextType) == false)
5763
{
5864
throw new InvalidOperationException($"{bindingContextType.Name} already warmed up.");

tests/UnityMvvmToolkit.Test.Integration/BindingContextObjectProviderTests.cs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,37 @@
77
using UnityMvvmToolkit.Core.Internal.ObjectHandlers;
88
using UnityMvvmToolkit.Core.Internal.ObjectWrappers;
99
using UnityMvvmToolkit.Test.Integration.TestBindingContext;
10+
using UnityMvvmToolkit.Test.Unit.TestBindingContext;
1011

1112
namespace UnityMvvmToolkit.Test.Integration;
1213

1314
public class BindingContextObjectProviderTests
1415
{
1516
[Fact]
16-
public void WarmupViewModel_ShouldWarmupBindingContext_WhenBindingContextIsNotWarmup()
17+
public void WarmupAssemblyViewModels_ShouldWarmupAllViewModels()
18+
{
19+
// Arrange
20+
var objectProvider = new BindingContextObjectProvider(Array.Empty<IValueConverter>());
21+
22+
// Act
23+
objectProvider.WarmupAssemblyViewModels();
24+
25+
// Assert
26+
objectProvider
27+
.Invoking(sut => sut.WarmupViewModel<MyBindingContext>())
28+
.Should()
29+
.Throw<InvalidOperationException>()
30+
.WithMessage($"{nameof(MyBindingContext)} already warmed up.");
31+
32+
objectProvider
33+
.Invoking(sut => sut.WarmupViewModel<EmptyBindingContext>())
34+
.Should()
35+
.Throw<InvalidOperationException>()
36+
.WithMessage($"{nameof(EmptyBindingContext)} already warmed up.");
37+
}
38+
39+
[Fact]
40+
public void WarmupViewModelT_ShouldWarmupBindingContext_WhenBindingContextIsNotWarmup()
1741
{
1842
// Arrange
1943
var objectProvider = new BindingContextObjectProvider(Array.Empty<IValueConverter>());
@@ -29,6 +53,41 @@ public void WarmupViewModel_ShouldWarmupBindingContext_WhenBindingContextIsNotWa
2953
.WithMessage($"{nameof(MyBindingContext)} already warmed up.");
3054
}
3155

56+
[Fact]
57+
public void WarmupViewModel_ShouldWarmupBindingContext_WhenBindingContextIsNotWarmup()
58+
{
59+
// Arrange
60+
var bindingContextType = typeof(MyBindingContext);
61+
var objectProvider = new BindingContextObjectProvider(Array.Empty<IValueConverter>());
62+
63+
// Act
64+
objectProvider.WarmupViewModel(bindingContextType);
65+
66+
// Assert
67+
objectProvider
68+
.Invoking(sut => sut.WarmupViewModel(bindingContextType))
69+
.Should()
70+
.Throw<InvalidOperationException>()
71+
.WithMessage($"{bindingContextType.Name} already warmed up.");
72+
}
73+
74+
[Theory]
75+
[InlineData(typeof(NoBindingContext))]
76+
[InlineData(typeof(AbstractBindingContext))]
77+
[InlineData(typeof(IInterfaceBindingContext))]
78+
public void WarmupViewModel_ShouldThrow_WhenBindingContextIsNotSupported(Type bindingContextType)
79+
{
80+
// Arrange
81+
var objectProvider = new BindingContextObjectProvider(Array.Empty<IValueConverter>());
82+
83+
// Assert
84+
objectProvider
85+
.Invoking(sut => sut.WarmupViewModel(bindingContextType))
86+
.Should()
87+
.Throw<InvalidOperationException>()
88+
.WithMessage($"Can not warmup {bindingContextType.Name}.");
89+
}
90+
3291
[Fact]
3392
public void WarmupValueConverter_ShouldNotThrow_WhenValueConverterWasNotWarmup()
3493
{
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using UnityMvvmToolkit.Core.Interfaces;
2+
3+
namespace UnityMvvmToolkit.Test.Integration.TestBindingContext;
4+
5+
public abstract class AbstractBindingContext : IBindingContext
6+
{
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using UnityMvvmToolkit.Core.Interfaces;
2+
3+
namespace UnityMvvmToolkit.Test.Integration.TestBindingContext;
4+
5+
public class EmptyBindingContext : IBindingContext
6+
{
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using UnityMvvmToolkit.Core.Interfaces;
2+
3+
namespace UnityMvvmToolkit.Test.Integration.TestBindingContext;
4+
5+
public interface IInterfaceBindingContext : IBindingContext
6+
{
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
namespace UnityMvvmToolkit.Test.Integration.TestBindingContext;
2+
3+
public class NotBindingContext
4+
{
5+
}

0 commit comments

Comments
 (0)