/// <summary>
 /// If this <see cref="Configuration"/> contains a mapping for the specified
 /// <see cref="IConfigurationRequirement"/> <paramref name="requirement"/> and the mapped <see cref="object"/>
 /// is of type <typeparamref name="T"/>, <paramref name="result"/> is set to the mapped <see cref="object"/>
 /// and <see langword="true"/> is returned. Otherwise, <paramref name="result"/> is set to the return value of
 /// invoking the <paramref name="defaultValueFactory"/>, and <see langword="false"/> is returned.
 /// </summary>
 /// <param name="requirement">
 /// The <see cref="IConfigurationRequirement"/>.
 /// </param>
 /// <param name="defaultValueFactory">
 /// The default value factory.
 /// </param>
 /// <param name="result">
 /// The result.
 /// </param>
 /// <typeparam name="T">
 /// The expected <see cref="Type"/> of the <see cref="object"/> to return. If the specified
 /// <see cref="IConfigurationRequirement"/> is contained by this <see cref="Configuration"/>, but the mapped
 /// <see cref="object"/> is of a <see cref="Type"/> not compatible with <typeparamref name="T"/>, then the
 /// <paramref name="defaultValueFactory"/> will be invoked.
 /// </typeparam>
 /// <returns>
 /// <see langword="true"/> if the <see cref="IConfigurationRequirement"/> <paramref name="requirement"/> is
 /// contained by this <see cref="Configuration"/>, and <paramref name="result"/> is able to be
 /// set to the expected <see cref="Type"/> <typeparamref name="T"/>; otherwise, <see langword="false"/>.
 /// </returns>
 public bool TryGetOrDefault <T>(
     IConfigurationRequirement requirement,
     Func <T> defaultValueFactory,
     out T result)
 {
     return(this.backingConfiguration.TryGetOrDefault <T>(requirement, defaultValueFactory, out result));
 }
示例#2
0
        public static object GetDefaultValidObjectForRequirement(IConfigurationRequirement requirement)
        {
            if (requirement == null)
            {
                throw new ArgumentNullException(nameof(requirement));
            }

            if (!TestUtil.defaultValidObjects.TryGetValue(requirement.OfType, out object result))
            {
                throw new ArgumentException(
                          string.Format(
                              CultureInfo.InvariantCulture,
                              "Unrecognized ConfigurationRequirementType '{0}'.",
                              requirement.OfType.Type.ToString()));
            }

            if (requirement.CollectionInfo == null)
            {
                return(result);
            }
            else
            {
                object[] buffer = new object[requirement.CollectionInfo.MinimumCount];
                for (int counter = 0; counter < buffer.Length; counter++)
                {
                    buffer[counter] = result;
                }

                return(buffer);
            }
        }
        public static void Compare(
            string expectedName,
            string expectedDescription,
            ConfigurationRequirementType expectedType,
            bool expectedOptionality,
            CollectionInfo collectionInfo,
            IEnumerable <IConfigurationRequirement> dependsOn,
            IEnumerable <IConfigurationRequirement> exclusiveWith,
            Func <IConfigurationRequirement> requirementFactory,
            object badInput,
            object goodInput)
        {
            IConfigurationRequirement requirement = requirementFactory.Invoke();

            Assert.AreEqual(expectedName, requirement.Name);
            Assert.AreEqual(expectedDescription, requirement.Description);
            Assert.AreEqual(expectedType, requirement.OfType);
            Assert.AreEqual(expectedOptionality, requirement.IsOptional);
            Assert.AreEqual(collectionInfo, requirement.CollectionInfo);
            CollectionAssert.AreEquivalent(dependsOn.ToArray(), requirement.DependsOn.ToArray());
            CollectionAssert.AreEquivalent(exclusiveWith.ToArray(), requirement.ExclusiveWith.ToArray());

            Assert.AreEqual(typeof(ArgumentNullException), requirement.Validate(null).GetType());
            Assert.AreEqual(typeof(ArgumentException), requirement.Validate(badInput).GetType());
            Assert.IsNull(requirement.Validate(goodInput));
        }
        /// <summary>
        /// Internal.
        /// </summary>
        /// <typeparam name="T">
        /// Internal.
        /// </typeparam>
        /// <param name="requirement">
        /// Internal.
        /// </param>
        /// <param name="defaultValueFactory">
        /// Internal.
        /// </param>
        /// <param name="result">
        /// Internal.
        /// </param>
        /// <returns>
        /// Internal.
        /// </returns>
        public bool TryGetOrDefault <T>(
            IConfigurationRequirement requirement,
            Func <T> defaultValueFactory,
            out T result)
        {
            if (requirement == null)
            {
                throw new ArgumentNullException(nameof(requirement));
            }

            if (defaultValueFactory == null)
            {
                throw new ArgumentNullException(nameof(defaultValueFactory));
            }

            if (this.backingDictionary.TryGetValue(requirement, out object actual))
            {
                if (actual is T buffer)
                {
                    result = buffer;
                    return(true);
                }
            }

            result = defaultValueFactory.Invoke();
            return(false);
        }
        public void Configuration_Ctor_MultipleFailuresOccur_ThrowsAggregateException()
        {
            const string validationFailureMessage = "BOUNDCONFIGURATIONTESTS_MultipleFailuresOccur";
            const string testFailureMessage       = "Missing/too many matches for expected exception.";
            const int    expectedFailureCount     = 4;

            IConfigurationRequirement requiredButMissing = TestUtil.CreateConfigurationRequirement(
                baseName: nameof(requiredButMissing),
                isOptional: false);
            IConfigurationRequirement dependsOnIsMissing = TestUtil.CreateConfigurationRequirement(
                baseName: nameof(dependsOnIsMissing),
                dependsOn: new IConfigurationRequirement[] { requiredButMissing });
            IConfigurationRequirement failsValidation = TestUtil.CreateConfigurationRequirement(
                baseName: nameof(failsValidation),
                validator: (x, y, z) => throw new NotImplementedException(validationFailureMessage));
            IConfigurationRequirement exclusiveWith = TestUtil.CreateConfigurationRequirement(
                baseName: nameof(exclusiveWith),
                exclusiveWith: new IConfigurationRequirement[] { failsValidation });
            IConfigurationRequirement isFine = TestUtil.CreateConfigurationRequirement(
                baseName: nameof(isFine),
                validator: (x, y, z) => null);

            IRequirementSource configurable = ConfigurationTests.CreateRequirementSource(
                requiredButMissing,
                dependsOnIsMissing,
                failsValidation,
                exclusiveWith,
                isFine);

            Dictionary <IConfigurationRequirement, object> bindings =
                new IConfigurationRequirement[] { dependsOnIsMissing, failsValidation, exclusiveWith, isFine }
            .Select(x => new KeyValuePair <IConfigurationRequirement, object>(x, null))
            .ToDictionary(x => x.Key, x => x.Value);

            AggregateException exception = Assert.ThrowsException <AggregateException>(() =>
                                                                                       new Configuration(configurable, bindings));

            Assert.AreEqual(expectedFailureCount, exception.InnerExceptions.Count);
            Assert.IsNotNull(
                exception
                .InnerExceptions
                .SingleOrDefault(x => x.Message.Contains(validationFailureMessage)),
                testFailureMessage);
            Assert.IsNotNull(
                exception
                .InnerExceptions
                .SingleOrDefault(x => x.Message.Contains("has conflicting requirements specified.")),
                testFailureMessage);
            Assert.IsNotNull(
                exception
                .InnerExceptions
                .SingleOrDefault(x => x.Message.Contains("does not have its dependencies fulfilled.")),
                testFailureMessage);
            Assert.IsNotNull(
                exception
                .InnerExceptions
                .SingleOrDefault(x => x.Message.Contains("Missing required requirement")),
                testFailureMessage);
        }
示例#6
0
        public void TestFolderDataSourceFactory()
        {
            IDataSourceFactory factory = this.Factories.Single(x => x.GetType() == typeof(FolderDataSourceFactory));
            Dictionary <IConfigurationRequirement, object> inputs =
                factory
                .Requirements
                .Select(
                    requirement =>
            {
                Console.Write(requirement.Name + " - (" + requirement.Description + "): ");
                string input = Console.ReadLine();
                if (input == "null")
                {
                    input = null;
                }

                return(new KeyValuePair <IConfigurationRequirement, object>(requirement, input));
            })
                .ToDictionary(x => x.Key, x => x.Value);

            IConfigurationRequirement rootRequirement = factory.Requirements.Single(x => x.Name == "Root Path");

            inputs[rootRequirement] = new FilePath((string)inputs[rootRequirement]);
            IConfigurationRequirement tickRequirement =
                factory.Requirements.Single(x => x.Name == "Change Filter Ticks");

            inputs[tickRequirement] = inputs[tickRequirement] ==
                                      null ? 0L : long.Parse((string)inputs[tickRequirement]);

            IDataSource dataSource = factory.MakeDataSource(inputs);

            dataSource.OnChange +=
                (obj, e) =>
            {
                DataSourceChangeEventType type        = e.EventType;
                IDataInformation          information = e.GetImageInformation();
                if (type == DataSourceChangeEventType.Added)
                {
                    Console.WriteLine("Added: " + information.Name);
                }
                else if (type == DataSourceChangeEventType.Changed)
                {
                    Console.WriteLine("Changed: " + information.Name);
                }
                else if (type == DataSourceChangeEventType.Removed)
                {
                    Console.WriteLine("Removed: " + information.Name);
                }
                else
                {
                    throw new InvalidOperationException("Unexpected DataSourceChangeEventType value.");
                }
            };

            Console.WriteLine("Monitoring folder '" + dataSource.Name + "'. Press enter to stop.");
            Console.ReadLine();

            dataSource.Dispose();
        }
        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());
        }
示例#8
0
        public void Mapping_Equals_ValuesDoNotMatch_ReturnsFalse()
        {
            IConfigurationRequirement requirement = ConfigurationRequirement.String("Name", "Description");
            Mapping first  = new Mapping(requirement, "Hello World");
            Mapping second = new Mapping(requirement, "Goodbye World");

            Assert.IsFalse(first.Equals(second));
            Assert.IsFalse(second.Equals(first));
        }
示例#9
0
        public void Mapping_Equals_OneHasValueNull_ReturnsFalse()
        {
            IConfigurationRequirement requirement = ConfigurationRequirement.String("Name", "Description");
            Mapping first  = new Mapping(requirement, "Hello World");
            Mapping second = new Mapping(requirement, null);

            Assert.IsFalse(first.Equals(second));
            Assert.IsFalse(second.Equals(first));
        }
示例#10
0
        public void Mapping_GetHashCode_DifferentInstances_ReturnsSameHash()
        {
            IConfigurationRequirement requirement = TestUtil.CreateConfigurationRequirement();
            object value = "Hello world";

            Mapping first  = new Mapping(requirement, value);
            Mapping second = new Mapping(requirement, value);

            Assert.AreEqual(first.GetHashCode(), second.GetHashCode());
        }
示例#11
0
        public void Mapping_Ctor_Success()
        {
            const string value = "Valid";
            IConfigurationRequirement requirement = ConfigurationRequirement.String("Name", "Description");

            Mapping mapping = new Mapping(requirement, value);

            Assert.AreEqual(requirement, mapping.Requirement);
            Assert.AreEqual(value, mapping.Value);
        }
示例#12
0
        public void Mapping_Equals_Succeeds()
        {
            const string value = "Hello World";
            IConfigurationRequirement requirement = ConfigurationRequirement.String("Name", "Description");

            Mapping first  = new Mapping(requirement, value);
            Mapping second = new Mapping(requirement, value);

            Assert.IsTrue(first.Equals(second));
            Assert.IsTrue(second.Equals(first));
        }
示例#13
0
        public void Mapping_Equals_RequirementsDoNotMatch_ReturnsFalse()
        {
            const string value = "Hello World";
            IConfigurationRequirement requirement1 = ConfigurationRequirement.String("Name1", "Description");
            IConfigurationRequirement requirement2 = ConfigurationRequirement.String("Name2", "Description");

            Mapping first  = new Mapping(requirement1, value);
            Mapping second = new Mapping(requirement2, value);

            Assert.IsFalse(first.Equals(second));
            Assert.IsFalse(second.Equals(first));
        }
        public void ConfigurationRequirement_SimpleValidator_AdditionalValidation_ReturnsNull()
        {
            IConfigurationRequirement requirement = TestUtil.CreateConfigurationRequirement();

            Assert.IsNull(
                ConfigurationRequirement
                .SimpleValidator(
                    requirement.OfType,
                    TestUtil.GetDefaultValidObjectForRequirement(requirement),
                    requirement,
                    new MockConfiguration(),
                    (x, y, z) => null));
        }
        public void Configuration_Ctor_RequiredRequirementIsNotPresent_ThrowsAggregate()
        {
            IConfigurationRequirement required =
                TestUtil.CreateConfigurationRequirement(isOptional: false);

            IRequirementSource configurable = ConfigurationTests.CreateRequirementSource(required);

            AggregateException exception = Assert.ThrowsException <AggregateException>(() =>
                                                                                       new Configuration(configurable, new Dictionary <IConfigurationRequirement, object>()));

            Assert.AreEqual(1, exception.InnerExceptions.Count);
            StringAssert.Contains(exception.InnerExceptions.Single().Message, "Missing required requirement");
        }
        public void ConfigurationRequirement_SimpleValidator_Collection_ValidObject()
        {
            IConfigurationRequirement requirement =
                TestUtil.CreateConfigurationRequirement(collectionInfo: new CollectionInfo(1));
            object value = TestUtil.GetDefaultValidObjectForRequirement(requirement);

            Assert.IsNull(
                ConfigurationRequirement
                .SimpleValidator(
                    requirement.OfType,
                    value,
                    requirement,
                    new MockConfiguration()));
        }
        public void ConfigurationRequirement_SimpleValidator_NullObject()
        {
            IConfigurationRequirement requirement = TestUtil.CreateConfigurationRequirement();

            Assert.AreEqual(
                typeof(ArgumentNullException),
                ConfigurationRequirement
                .SimpleValidator(
                    requirement.OfType,
                    null,
                    requirement,
                    new MockConfiguration())
                ?.GetType());
        }
        public void Configuration_TryGetOrDefault_ValueNotPresent_UsesValueFactory()
        {
            ConfigurationRequirementType type = ConfigurationRequirementType.Uri;

            Configuration configuration = ConfigurationTests.CreateConfiguration(
                TestUtil.GetDefaultValidObjectForRequirement,
                out IConfigurationRequirement present);
            IConfigurationRequirement notPresent = TestUtil.CreateConfigurationRequirement(type: type);

            Uri expected = (Uri)TestUtil.GetDefaultValidObjectForRequirement(notPresent);

            Assert.IsFalse(configuration.TryGetOrDefault(notPresent, () => expected, out Uri actual));
            Assert.AreEqual(expected, actual);
        }
        public void ConfigurationRequirement_SimpleValidator_Collection_CollectionIsEmpty()
        {
            object[] value = new object[0];
            IConfigurationRequirement requirement = TestUtil.CreateConfigurationRequirement(
                collectionInfo: new CollectionInfo(0));

            Exception result = ConfigurationRequirement.SimpleValidator(
                requirement.OfType,
                value,
                requirement,
                new MockConfiguration());

            Assert.IsNull(result);
        }
        public void ConfigurationRequirement_SimpleValidator_Collection_CollectionIsRightSizeButContainsWrongType()
        {
            object[] value = new object[] { 8675309L, "Not assignable to expected type" };
            ConfigurationRequirementType type        = ConfigurationRequirementType.Int64;
            IConfigurationRequirement    requirement = TestUtil.CreateConfigurationRequirement(
                type: type,
                collectionInfo: new CollectionInfo(1, 3));

            Exception result = ConfigurationRequirement.SimpleValidator(
                type,
                value,
                requirement,
                new MockConfiguration());

            Assert.AreEqual(typeof(ArgumentException), result?.GetType());
        }
        public void Configuration_Indexer_Get_Succeeds()
        {
            IConfigurationRequirement requirement = TestUtil.CreateConfigurationRequirement();
            object expected = TestUtil.GetDefaultValidObjectForRequirement(requirement);
            Dictionary <IConfigurationRequirement, object> bindings =
                new Dictionary <IConfigurationRequirement, object>()
            {
                [requirement] = expected
            };

            IRequirementSource configurable = ConfigurationTests.CreateRequirementSource(requirement);

            Configuration configuration = new Configuration(configurable, bindings);

            Assert.AreEqual(expected, configuration[requirement]);
        }
        private static Configuration CreateConfiguration(
            Func <IConfigurationRequirement, object> valueFactory,
            out IConfigurationRequirement requirement,
            Func <IConfigurationRequirement> requirementFactory = null)
        {
            requirement = (requirementFactory ?? (() => TestUtil.CreateConfigurationRequirement())).Invoke();
            Dictionary <IConfigurationRequirement, object> bindings =
                new Dictionary <IConfigurationRequirement, object>()
            {
                [requirement] = valueFactory.Invoke(requirement)
            };

            IRequirementSource configurable = ConfigurationTests.CreateRequirementSource(requirement);

            return(new Configuration(configurable, bindings));
        }
        public void ConfigurationRequirement_SimpleValidator_AdditionalValidation_ThrowsException()
        {
            Exception toReturn = new Exception("CONFIGURATIONREQUIREMENTTESTS_AdditionalValidation");
            IConfigurationRequirement requirement = TestUtil.CreateConfigurationRequirement();

            Assert.AreEqual(
                toReturn.Message,
                ConfigurationRequirement
                .SimpleValidator(
                    requirement.OfType,
                    TestUtil.GetDefaultValidObjectForRequirement(requirement),
                    requirement,
                    new MockConfiguration(),
                    (x, y, z) => throw toReturn)
                .Message);
        }
        public void ConfigurationRequirement_SimpleValidator_Collection_CollectionTooLarge()
        {
            string[] value = new string[] { "Too big", "Too big", "Too big" };
            ConfigurationRequirementType type        = ConfigurationRequirementType.String;
            IConfigurationRequirement    requirement = TestUtil.CreateConfigurationRequirement(
                type: type,
                collectionInfo: new CollectionInfo(1, 2));

            Assert.AreEqual(
                typeof(ArgumentException),
                ConfigurationRequirement
                .SimpleValidator(
                    type,
                    value,
                    requirement,
                    new MockConfiguration())
                ?.GetType());
        }
        public void Configuration_GetOrDefault_ValueNotPresent_UsesValueFactory()
        {
            const string fallbackValue = "Configuration_GetOrDefault";

            IConfigurationRequirement present    = TestUtil.CreateConfigurationRequirement();
            IConfigurationRequirement notPresent = TestUtil.CreateConfigurationRequirement(isOptional: true);
            object expected = TestUtil.GetDefaultValidObjectForRequirement(present);
            Dictionary <IConfigurationRequirement, object> bindings =
                new Dictionary <IConfigurationRequirement, object>()
            {
                [present] = expected
            };

            IRequirementSource configurable = ConfigurationTests.CreateRequirementSource(notPresent);

            Configuration configuration = new Configuration(configurable, bindings);

            Assert.AreEqual(fallbackValue, configuration.GetOrDefault(notPresent, () => fallbackValue));
        }
        public void ConfigurationRequirement_SimpleValidator_Collection_ObjectIsNotCollection()
        {
            const string value = "Invalid";
            ConfigurationRequirementType type        = ConfigurationRequirementType.String;
            IConfigurationRequirement    requirement =
                TestUtil.CreateConfigurationRequirement(
                    type: type,
                    collectionInfo: new CollectionInfo(1));

            Assert.AreEqual(
                typeof(ArgumentException),
                ConfigurationRequirement
                .SimpleValidator(
                    type,
                    value,
                    requirement,
                    new MockConfiguration())
                ?.GetType());
        }
        /// <summary>
        /// Internal.
        /// </summary>
        /// <param name="requirement">
        /// Internal.
        /// </param>
        /// <param name="defaultValueFactory">
        /// Internal.
        /// </param>
        /// <returns>
        /// Internal.
        /// </returns>
        public object GetOrDefault(IConfigurationRequirement requirement, Func <object> defaultValueFactory)
        {
            if (requirement == null)
            {
                throw new ArgumentNullException(nameof(requirement));
            }

            if (defaultValueFactory == null)
            {
                throw new ArgumentNullException(nameof(defaultValueFactory));
            }

            if (!this.backingDictionary.TryGetValue(requirement, out object result))
            {
                result = defaultValueFactory.Invoke();
            }

            return(result);
        }
        public void Configuration_Ctor_RequirementFailsValidation_ThrowsAggregate()
        {
            const string exceptionMessage = "BOUNDCONFIGURATIONTESTS_RequirementFailsValidation";

            IConfigurationRequirement required = TestUtil.CreateConfigurationRequirement(
                validator: (x, y, z) => throw new NotImplementedException(exceptionMessage));

            IRequirementSource configurable = ConfigurationTests.CreateRequirementSource(required);

            AggregateException exception = Assert.ThrowsException <AggregateException>(() =>
                                                                                       new Configuration(
                                                                                           configurable,
                                                                                           new Dictionary <IConfigurationRequirement, object>()
            {
                [required] = "dontCare"
            }));

            Assert.AreEqual(1, exception.InnerExceptions.Count);
            Assert.AreEqual(exceptionMessage, exception.InnerExceptions.Single().Message);
        }
示例#29
0
        public static void Compare(
            string expectedName,
            string expectedDescription,
            ConfigurationRequirementType expectedType,
            Func <IConfigurationRequirement> requirementFactory,
            object badInput,
            object goodInput)
        {
            IConfigurationRequirement requirement = requirementFactory.Invoke();

            Assert.AreEqual(expectedName, requirement.Name);
            Assert.AreEqual(expectedDescription, requirement.Description);
            Assert.AreEqual(expectedType, requirement.OfType);
            Assert.IsNull(requirement.CollectionInfo);
            Assert.IsFalse(requirement.DependsOn.Any());
            Assert.IsFalse(requirement.ExclusiveWith.Any());

            Assert.AreEqual(typeof(ArgumentNullException), requirement.Validate(null).GetType());
            Assert.AreEqual(typeof(ArgumentException), requirement.Validate(badInput).GetType());
            Assert.IsNull(requirement.Validate(goodInput));
        }
        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());
        }