public void PopulateAssignsValueUsingDefaultExecuteOrderRulesTest() { var first = SimpleEnum.Seventh; var second = Environment.TickCount; var third = Guid.NewGuid().ToString(); var fourth = new Person(); var expected = new PopulateOrderItem(); var valueGenerators = new List<IValueGenerator>(); var typeCreators = new List<ITypeCreator>(); var executeOrderRules = Model.BuildStrategy.ExecuteOrderRules; var buildStrategy = Substitute.For<IBuildStrategy>(); var typeCreator = Substitute.For<ITypeCreator>(); var valueGenerator = Substitute.For<IValueGenerator>(); typeCreators.Add(typeCreator); valueGenerators.Add(valueGenerator); buildStrategy.TypeCreators.Returns(typeCreators.AsReadOnly()); buildStrategy.ValueGenerators.Returns(valueGenerators.AsReadOnly()); buildStrategy.ExecuteOrderRules.Returns(executeOrderRules); var target = new DefaultExecuteStrategy(); target.Initialize(buildStrategy, buildStrategy.GetBuildLog()); valueGenerator.IsSupported( typeof(SimpleEnum), "Z", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)).Returns(true); valueGenerator.Generate(typeof(SimpleEnum), "Z", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(first); valueGenerator.IsSupported(typeof(int), "Y", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(true); valueGenerator.Generate(typeof(int), "Y", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(second); valueGenerator.IsSupported(typeof(string), "X", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(true); valueGenerator.Generate(typeof(string), "X", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(third); typeCreator.CanCreate(typeof(Person), "W", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(true); typeCreator.Create(typeof(Person), "W", Arg.Is<LinkedList<object>>(x => x.Last.Value == expected)) .Returns(fourth); typeCreator.Populate(fourth, target).Returns(fourth); var actual = (PopulateOrderItem)target.Populate(expected); actual.Should().BeSameAs(expected); actual.Z.Should().Be(first); actual.Y.Should().Be(second); actual.X.Should().Be(third); actual.W.Should().BeSameAs(fourth); }