public void IsInvokableWithDefaultParametersIsCorrect(Type type, bool expectedIsInvokableWithDefaultParameters, params string[] resolvableMemberNames)
        {
            var constructor = type.GetTypeInfo().GetConstructors()[0];
            var members     = resolvableMemberNames.ToDictionary(x => x, x => (IConfigurationSection)null);

            var orderInfo = new ConstructorOrderInfo(constructor, members, Resolver.Empty);

            Assert.Same(constructor, orderInfo.Constructor);
            Assert.Equal(expectedIsInvokableWithDefaultParameters, orderInfo.IsInvokableWithDefaultParameters);
        }
        public void TotalParametersIsCorrect(Type type, int expectedTotalParameters)
        {
            var constructor = type.GetTypeInfo().GetConstructors()[0];
            var members     = new Dictionary <string, IConfigurationSection>();

            var orderInfo = new ConstructorOrderInfo(constructor, members, Resolver.Empty);

            Assert.Same(constructor, orderInfo.Constructor);
            Assert.Equal(expectedTotalParameters, orderInfo.TotalParameters);
        }
        public void CompareToReturnsTheCorrectValue(Type lhsConstructorType, Type rhsConstructorType, int expectedComparisonValue, params string[] resolvableMemberNames)
        {
            var lhsConstructor = lhsConstructorType.GetTypeInfo().GetConstructors()[0];
            var rhsConstructor = rhsConstructorType.GetTypeInfo().GetConstructors()[0];

            var members = resolvableMemberNames.ToDictionary(x => x, x => (IConfigurationSection)null);

            var lhs = new ConstructorOrderInfo(lhsConstructor, members, Resolver.Empty);
            var rhs = new ConstructorOrderInfo(rhsConstructor, members, Resolver.Empty);

            var actual = lhs.CompareTo(rhs);

            Assert.Equal(expectedComparisonValue, actual);
        }
        public void AlternateNameIsUsed(Type type, string configurationMemberName)
        {
            var constructor = type.GetConstructors()[0];
            var members     = new Dictionary <string, IConfigurationSection>()
            {
                { configurationMemberName, null }
            };

            var orderInfo = new ConstructorOrderInfo(constructor, members, Resolver.Empty);

            Assert.True(orderInfo.IsInvokableWithoutDefaultParameters);
            Assert.True(orderInfo.IsInvokableWithDefaultParameters);
            Assert.Equal(1, orderInfo.MatchedParameters);
            Assert.Empty(orderInfo.MissingParameterNames);
        }
        public void GivenTheBestMatchingConstructorHasParametersNotMappedToAConfigurationChild_ThrowsArgumentException()
        {
            var config = new ConfigurationBuilder()
                         .AddInMemoryCollection(new Dictionary <string, string>
            {
                { "foo:bar", "123" },
            })
                         .Build();

            var fooSection = config.GetSection("foo");
            var actual     = Assert.Throws <InvalidOperationException>(() => fooSection.Create <TwoArgConstructor>());

#if DEBUG
            var constructorOrderInfo = new ConstructorOrderInfo(
                typeof(TwoArgConstructor).GetTypeInfo().GetConstructors()[0],
                new Dictionary <string, IConfigurationSection> {
                { "bar", null }
            },
                Resolver.Empty);
            var expected = Exceptions.MissingRequiredConstructorParameters(fooSection, constructorOrderInfo);
            Assert.Equal(expected.Message, actual.Message);
#endif
        }