public void Configuration_Ctor_MissingOptionalRequirement_Succeeds()
        {
            const int requirementCount = 50;

            IEnumerable <IConfigurationRequirement> requirements =
                TestUtil.CreateIConfigurationRequirementCollection(requirementCount, true, areOptional: true);
            MockRequirementSource configurable = new MockRequirementSource(requirements);

            Dictionary <IConfigurationRequirement, object> validObjects =
                requirements
                .Select(x =>
                        new KeyValuePair <IConfigurationRequirement, object>(
                            x,
                            TestUtil.GetDefaultValidObjectForRequirement(x)))
                .ToDictionary(
                    x => x.Key,
                    x => x.Value);

            // Remove one of the requirements that we're supplying to the constructor. Because they're all optional,
            // this shouldn't cause any problems.
            validObjects.Remove(validObjects.First().Key);

            Configuration boundConfiguration = new Configuration(configurable, validObjects);

            Assert.IsNotNull(boundConfiguration);
        }
        public void Configuration_Ctor_DependsOn_PropagatesDependencies()
        {
            IConfigurationRequirement parent1 = TestUtil.CreateConfigurationRequirement(baseName: "ParentOne");
            IConfigurationRequirement parent2 = TestUtil.CreateConfigurationRequirement(baseName: "ParentTwo");
            IConfigurationRequirement child1  = TestUtil.CreateConfigurationRequirement(
                baseName: "ChildOne",
                dependsOn: new IConfigurationRequirement[] { parent1 },
                validator: (x, y, z) =>
            {
                CollectionAssert.Contains(z.Keys.ToArray(), parent1);

                return(null);
            });
            IConfigurationRequirement child2 = TestUtil.CreateConfigurationRequirement(
                baseName: "ChildTwo",
                dependsOn: new IConfigurationRequirement[] { child1 },
                validator: (x, y, z) =>
            {
                CollectionAssert.Contains(z.Keys.ToArray(), child1);

                return(null);
            });
            IConfigurationRequirement child3 = TestUtil.CreateConfigurationRequirement(
                baseName: "ChildThree",
                dependsOn: new IConfigurationRequirement[] { parent2, child2 },
                validator: (x, y, z) =>
            {
                CollectionAssert.Contains(z.Keys.ToArray(), parent2);
                CollectionAssert.Contains(z.Keys.ToArray(), child2);

                return(null);
            });

            Dictionary <IConfigurationRequirement, object> supplied =
                new Dictionary <IConfigurationRequirement, object>()
            {
                [parent1] = TestUtil.GetDefaultValidObjectForRequirement(parent1),
                [parent2] = TestUtil.GetDefaultValidObjectForRequirement(parent2),
                [child1]  = TestUtil.GetDefaultValidObjectForRequirement(child1),
                [child2]  = TestUtil.GetDefaultValidObjectForRequirement(child2),
                [child3]  = TestUtil.GetDefaultValidObjectForRequirement(child3)
            };

            MockRequirementSource configurable = new MockRequirementSource(
                new IConfigurationRequirement[]
            {
                parent1,
                parent2,
                child1,
                child2,
                child3
            });
            Configuration configuration = new Configuration(configurable, supplied);

            Assert.IsNotNull(configuration);
            CollectionAssert.AreEquivalent(
                supplied.Select(x => new Mapping(x.Key, x.Value)).ToArray(),
                configuration.ToArray());
        }
        public void Configuration_Ctor_Configurator_Propagates()
        {
            MockRequirementSource source       = new MockRequirementSource(Enumerable.Empty <IConfigurationRequirement>());
            MockConfigurator      configurator = new MockConfigurator(source, (x, y) => null);

            Configuration configuration = new Configuration(
                source,
                new Dictionary <IConfigurationRequirement, object>(),
                configurator);

            Assert.AreSame(configurator, configuration.Configurator);
        }
        public void Configuration_Ctor_DependsOnChains_Succeeds()
        {
            IConfigurationRequirement parent = TestUtil.CreateConfigurationRequirement(baseName: "Parent");
            IConfigurationRequirement child  = TestUtil.CreateConfigurationRequirement(
                baseName: "Child",
                dependsOn: new IConfigurationRequirement[] { parent });

            Dictionary <IConfigurationRequirement, object> supplied =
                new Dictionary <IConfigurationRequirement, object>()
            {
                [parent] = TestUtil.GetDefaultValidObjectForRequirement(parent),
                [child]  = TestUtil.GetDefaultValidObjectForRequirement(child)
            };

            MockRequirementSource configurable  = new MockRequirementSource(new IConfigurationRequirement[] { parent, child });
            Configuration         configuration = new Configuration(configurable, supplied);

            Assert.IsNotNull(configuration);
            CollectionAssert.AreEquivalent(
                supplied.Select(x => new Mapping(x.Key, x.Value)).ToArray(),
                configuration.ToArray());
        }
        public void Configuration_Ctor_Succeeds()
        {
            const int requirementCount = 50;

            IEnumerable <IConfigurationRequirement> requirements =
                TestUtil.CreateIConfigurationRequirementCollection(requirementCount, true);
            MockRequirementSource configurable = new MockRequirementSource(requirements);

            Dictionary <IConfigurationRequirement, object> validObjects =
                requirements
                .Select(x =>
                        new KeyValuePair <IConfigurationRequirement, object>(
                            x,
                            TestUtil.GetDefaultValidObjectForRequirement(x)))
                .ToDictionary(
                    x => x.Key,
                    x => x.Value);

            Configuration boundConfiguration = new Configuration(configurable, validObjects);

            Assert.IsNotNull(boundConfiguration);
        }