public void CreateWithReturnsValueFromSupportedCreatorTest()
{
var firstModel = new SlimModel();
var secondModel = new SlimModel();
var value = Guid.NewGuid();
var valueGenerators = new List<IValueGenerator>();
var typeCreators = new List<ITypeCreator>();
var buildStrategy = Substitute.For<IBuildStrategy>();
var firstCreator = Substitute.For<ITypeCreator>();
var secondCreator = Substitute.For<ITypeCreator>();
var generator = Substitute.For<IValueGenerator>();
typeCreators.Add(firstCreator);
typeCreators.Add(secondCreator);
valueGenerators.Add(generator);
buildStrategy.TypeCreators.Returns(typeCreators.AsReadOnly());
buildStrategy.ValueGenerators.Returns(valueGenerators.AsReadOnly());
var target = new DefaultExecuteStrategy();
target.Initialize(buildStrategy, buildStrategy.GetBuildLog());
firstCreator.CanCreate(typeof(SlimModel), null, Arg.Any<LinkedList<object>>()).Returns(false);
firstCreator.Create(typeof(SlimModel), null, Arg.Any<LinkedList<object>>()).Returns(firstModel);
firstCreator.Priority.Returns(10);
firstCreator.AutoPopulate.Returns(true);
firstCreator.Populate(firstModel, target).Returns(firstModel);
secondCreator.CanCreate(typeof(SlimModel), null, Arg.Any<LinkedList<object>>()).Returns(true);
secondCreator.Create(typeof(SlimModel), null, Arg.Any<LinkedList<object>>()).Returns(secondModel);
secondCreator.Priority.Returns(2);
secondCreator.AutoPopulate.Returns(true);
secondCreator.Populate(secondModel, target).Returns(secondModel);
generator.IsSupported(typeof(Guid), "Value", Arg.Is<LinkedList<object>>(x => x.Last.Value == secondModel))
.Returns(true);
generator.Generate(typeof(Guid), "Value", Arg.Is<LinkedList<object>>(x => x.Last.Value == secondModel))
.Returns(value);
var actual = (SlimModel)target.CreateWith(typeof(SlimModel));
actual.Should().BeSameAs(secondModel);
actual.Value.Should().Be(value);
}