Skip to content

Commit

Permalink
Updated DefaultPropertyResolver to determine property ordering
Browse files Browse the repository at this point in the history
Closes #69
  • Loading branch information
roryprimrose committed Mar 28, 2020
1 parent 6dd2088 commit 707e229
Show file tree
Hide file tree
Showing 10 changed files with 235 additions and 396 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="fluentassertions" Version="5.10.0" />
<PackageReference Include="fluentassertions" Version="5.10.3" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="nsubstitute" Version="4.2.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
<PrivateAssets>all</PrivateAssets>
Expand Down
6 changes: 3 additions & 3 deletions ModelBuilder.UnitTests/DefaultExecuteStrategyTTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,9 @@ public void PopulateAssignsPropertyValuesToExistingInstance()
typeof(SlimModel))
.Returns(typeCapability);
buildConfiguration.PropertyResolver.Returns(propertyResolver);
propertyResolver.CanPopulate(Arg.Is<PropertyInfo>(x => x.Name == nameof(SlimModel.Value)))
.Returns(true);
propertyResolver.ShouldPopulateProperty(
propertyResolver.GetOrderedProperties(buildConfiguration, typeof(SlimModel))
.Returns(typeof(SlimModel).GetProperties());
propertyResolver.IsIgnored(
buildConfiguration,
model,
Arg.Is<PropertyInfo>(x => x.Name == nameof(SlimModel.Value)),
Expand Down
73 changes: 16 additions & 57 deletions ModelBuilder.UnitTests/DefaultExecuteStrategyTests.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
namespace ModelBuilder.UnitTests
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using FluentAssertions;
using ModelBuilder.BuildActions;
using ModelBuilder.ExecuteOrderRules;
using ModelBuilder.TypeCreators;
using ModelBuilder.UnitTests.Models;
using ModelBuilder.ValueGenerators;
using NSubstitute;
using Xunit;
using Xunit.Abstractions;
Expand Down Expand Up @@ -191,11 +187,9 @@ public void CreateDeterminesPropertiesToCreateByProvidingConstructorArgsForNeste
Arg.Any<object[]>()).Returns(age);
processor.Populate(sut, expected).Returns(expected);
buildConfiguration.PropertyResolver.Returns(propertyResolver);
propertyResolver.CanPopulate(Arg.Is<PropertyInfo>(x => x.Name == nameof(SimpleConstructor.Model)))
.Returns(false);
propertyResolver.CanPopulate(Arg.Is<PropertyInfo>(x => x.Name == nameof(SimpleConstructor.Age)))
.Returns(true);
propertyResolver.ShouldPopulateProperty(
propertyResolver.GetOrderedProperties(buildConfiguration, typeof(SimpleConstructor))
.Returns(typeof(SimpleConstructor).GetProperties());
propertyResolver.IsIgnored(
Arg.Any<IBuildConfiguration>(),
expected,
Arg.Is<PropertyInfo>(x => x.Name == nameof(SimpleConstructor.Age)),
Expand All @@ -209,7 +203,7 @@ public void CreateDeterminesPropertiesToCreateByProvidingConstructorArgsForNeste
actual.Model.Should().Be(model);
actual.Age.Should().Be(age);

propertyResolver.Received(1).ShouldPopulateProperty(
propertyResolver.Received(1).IsIgnored(
buildConfiguration,
Arg.Is<object>(x => x.GetType() == typeof(SimpleConstructor)),
Arg.Is<PropertyInfo>(x => x.Name == nameof(SimpleConstructor.Age)),
Expand Down Expand Up @@ -364,43 +358,6 @@ public void CreateEvaluatesPostBuildActionsWhenCapabilityDoesNotSupportPopulatio
action.Received().Execute(Arg.Any<IBuildChain>(), Arg.Any<SlimModel>(), typeof(SlimModel));
}

[Fact]
public void CreatePopulatesPropertiesWhenExecuteOrderRulesIsNull()
{
var expected = new SlimModel();
var value = Guid.NewGuid();

var creator = Substitute.For<ITypeCreator>();
var generator = Substitute.For<IValueGenerator>();
var resolver = Substitute.For<IPropertyResolver>();
var buildConfiguration = Substitute.For<IBuildConfiguration>();

creator.CanCreate(buildConfiguration, Arg.Any<IBuildChain>(), typeof(SlimModel)).Returns(true);
creator.CanPopulate(buildConfiguration, Arg.Any<IBuildChain>(), typeof(SlimModel)).Returns(true);
creator.Create(Arg.Any<IExecuteStrategy>(), typeof(SlimModel), null).Returns(expected);
creator.Populate(Arg.Any<IExecuteStrategy>(), expected).Returns(expected);
creator.AutoPopulate.Returns(true);
resolver.CanPopulate(Arg.Any<PropertyInfo>()).Returns(true);
resolver.ShouldPopulateProperty(buildConfiguration, expected, Arg.Any<PropertyInfo>(),
Array.Empty<object>()).Returns(true);
generator.IsMatch(Arg.Any<IBuildChain>(), Arg.Any<PropertyInfo>()).Returns(true);
generator.Generate(Arg.Any<IExecuteStrategy>(), Arg.Any<PropertyInfo>()).Returns(value);
buildConfiguration.PropertyResolver.Returns(resolver);
buildConfiguration.ExecuteOrderRules.Returns((ICollection<IExecuteOrderRule>) null);
buildConfiguration.TypeCreators.Returns(new List<ITypeCreator> {creator});
buildConfiguration.ValueGenerators.Returns(new List<IValueGenerator> {generator});

var sut = new DefaultExecuteStrategy();

sut.Initialize(buildConfiguration);

var actual = (SlimModel) sut.Create(typeof(SlimModel));

actual.Should().Be(expected);
resolver.Received().CanPopulate(Arg.Any<PropertyInfo>());
actual.Value.Should().Be(value);
}

[Fact]
public void CreatePopulatesWithProcessorWhenAutoPopulateDisabled()
{
Expand Down Expand Up @@ -489,8 +446,9 @@ public void CreatePushesInstanceIntoBuildChain()
});
processor.Populate(sut, expected).Returns(expected);
buildConfiguration.PropertyResolver.Returns(propertyResolver);
propertyResolver.CanPopulate(Arg.Any<PropertyInfo>()).Returns(true);
propertyResolver.ShouldPopulateProperty(
propertyResolver.GetOrderedProperties(buildConfiguration, typeof(SlimModel))
.Returns(typeof(SlimModel).GetProperties());
propertyResolver.IsIgnored(
Arg.Any<IBuildConfiguration>(),
Arg.Any<object>(),
Arg.Any<PropertyInfo>(),
Expand Down Expand Up @@ -620,8 +578,9 @@ public void CreateReturnsValueFromProcessorWithPropertyPopulation()
processor.Build(sut, Arg.Any<PropertyInfo>(), Arg.Any<object[]>()).Returns(value);
processor.Populate(sut, expected).Returns(expected);
buildConfiguration.PropertyResolver.Returns(propertyResolver);
propertyResolver.CanPopulate(Arg.Any<PropertyInfo>()).Returns(true);
propertyResolver.ShouldPopulateProperty(
propertyResolver.GetOrderedProperties(buildConfiguration, typeof(SlimModel))
.Returns(typeof(SlimModel).GetProperties());
propertyResolver.IsIgnored(
Arg.Any<IBuildConfiguration>(),
Arg.Any<object>(),
Arg.Any<PropertyInfo>(),
Expand Down Expand Up @@ -830,9 +789,9 @@ public void CreateThrowsExceptionWhenNoCapabilityFoundForProperty()
processor.Build(sut, typeof(SlimModel), null).Returns(expected);
processor.Populate(sut, expected).Returns(expected);
buildConfiguration.PropertyResolver.Returns(propertyResolver);
propertyResolver.CanPopulate(Arg.Is<PropertyInfo>(x => x.Name == nameof(SlimModel.Value)))
.Returns(true);
propertyResolver.ShouldPopulateProperty(
propertyResolver.GetOrderedProperties(buildConfiguration, typeof(SlimModel))
.Returns(typeof(SlimModel).GetProperties());
propertyResolver.IsIgnored(
Arg.Any<IBuildConfiguration>(),
expected,
Arg.Is<PropertyInfo>(x => x.Name == nameof(SlimModel.Value)),
Expand Down Expand Up @@ -959,9 +918,9 @@ public void PopulateAssignsPropertyValuesToExistingInstance()
typeof(SlimModel))
.Returns(typeCapability);
buildConfiguration.PropertyResolver.Returns(propertyResolver);
propertyResolver.CanPopulate(Arg.Is<PropertyInfo>(x => x.Name == nameof(SlimModel.Value)))
.Returns(true);
propertyResolver.ShouldPopulateProperty(
propertyResolver.GetOrderedProperties(buildConfiguration, typeof(SlimModel))
.Returns(typeof(SlimModel).GetProperties());
propertyResolver.IsIgnored(
buildConfiguration,
model,
Arg.Is<PropertyInfo>(x => x.Name == nameof(SlimModel.Value)),
Expand Down
Loading

0 comments on commit 707e229

Please sign in to comment.