Skip to content

Commit

Permalink
Updated DefaultPropertyResolver to determine property ordering (#78)
Browse files Browse the repository at this point in the history
* Updated DefaultPropertyResolver to determine property ordering
* Disabled unnecessary stream check for release builds

Closes #69
  • Loading branch information
roryprimrose committed Mar 28, 2020
1 parent 6dd2088 commit 2b61e29
Show file tree
Hide file tree
Showing 11 changed files with 237 additions and 398 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

0 comments on commit 2b61e29

Please sign in to comment.