public void MatchingGroupsWithGroupImport()
        {
            var repository = new Mock <IPluginRepository>();
            {
                repository.Setup(r => r.Parts())
                .Returns(s_Parts);
                repository.Setup(r => r.Part(It.IsAny <TypeIdentity>()))
                .Returns <TypeIdentity>(t => s_Parts.FirstOrDefault(p => p.Identity.Equals(t)));
                repository.Setup(r => r.Groups())
                .Returns(s_Groups);
                repository.Setup(r => r.Group(It.IsAny <GroupRegistrationId>()))
                .Returns <GroupRegistrationId>(id => s_Groups.FirstOrDefault(g => g.Id.Equals(id)));
            }

            var partImportEngine = new Mock <IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny <SerializableImportDefinition>(), It.IsAny <SerializableExportDefinition>()))
                .Returns(true);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            var groups       = importEngine.MatchingGroups(s_Groups[0].GroupImports.First());

            Assert.AreEqual(2, groups.Count());
            Assert.AreEqual(s_Groups[1].Id, groups.First().Id);
            Assert.AreEqual(s_Groups[2].Id, groups.Last().Id);
        }
        public void ExportMatchesSelectionCriteriaWithMatch()
        {
            var repository = new Mock <IPluginRepository>();
            {
                repository.Setup(r => r.Parts())
                .Returns(s_Parts);
                repository.Setup(r => r.Part(It.IsAny <TypeIdentity>()))
                .Returns <TypeIdentity>(t => s_Parts.FirstOrDefault(p => p.Identity.Equals(t)));
                repository.Setup(r => r.Groups())
                .Returns(s_Groups);
                repository.Setup(r => r.Group(It.IsAny <GroupRegistrationId>()))
                .Returns <GroupRegistrationId>(id => s_Groups.FirstOrDefault(g => g.Id.Equals(id)));
            }

            var partImportEngine = new Mock <IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny <SerializableImportDefinition>(), It.IsAny <SerializableExportDefinition>()))
                .Returns(true);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);

            Assert.IsTrue(
                importEngine.ExportPassesSelectionCriteria(
                    s_Groups.First().GroupExport,
                    new Dictionary <string, object>()));
        }
        public void GenerateConnectionForWithSingleConnection()
        {
            var repository       = new Mock <IPluginRepository>();
            var partImportEngine = new Mock <IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny <SerializableImportDefinition>(), It.IsAny <SerializableExportDefinition>()))
                .Returns <SerializableImportDefinition, SerializableExportDefinition>(
                    (import, export) => import.ContractName == export.ContractName);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            var connections  = importEngine.GenerateConnectionFor(s_Groups[0], s_Groups[0].GroupImports.First(), s_Groups[2]);

            Assert.AreEqual(1, connections.Count());

            var connection = connections.First();

            Assert.AreEqual(s_Groups[0].GroupImports.First().ImportsToMatch.First(), connection.Import);
            Assert.AreEqual(1, connection.Exports.Count());
            Assert.AreEqual(s_Groups[2].GroupExport.ProvidedExports.First(), connection.Exports.First());
        }
        public void Accepts()
        {
            var repository = new Mock<IPluginRepository>();
            {
                repository.Setup(r => r.Parts())
                    .Returns(s_Parts);
                repository.Setup(r => r.Part(It.IsAny<TypeIdentity>()))
                    .Returns<TypeIdentity>(t => s_Parts.FirstOrDefault(p => p.Identity.Equals(t)));
                repository.Setup(r => r.Groups())
                    .Returns(s_Groups);
                repository.Setup(r => r.Group(It.IsAny<GroupRegistrationId>()))
                    .Returns<GroupRegistrationId>(id => s_Groups.FirstOrDefault(g => g.Id.Equals(id)));
            }

            var partImportEngine = new Mock<IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny<SerializableImportDefinition>(), It.IsAny<SerializableExportDefinition>()))
                    .Returns(true);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            Assert.IsTrue(importEngine.Accepts(s_Groups[0].GroupImports.First(), s_Groups[2].GroupExport));
        }
        public void GenerateConnectionForWithMultipleConnections()
        {
            var group1 = CreateExportingGroup();
            var group2 = CreateImportingGroup();

            var repository       = new Mock <IPluginRepository>();
            var partImportEngine = new Mock <IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny <SerializableImportDefinition>(), It.IsAny <SerializableExportDefinition>()))
                .Returns <SerializableImportDefinition, SerializableExportDefinition>(
                    (import, export) => import.ContractName == export.ContractName);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            var connections  = importEngine.GenerateConnectionFor(group2, group2.GroupImports.First(), group1);

            Assert.AreEqual(2, connections.Count());

            var connection = connections.ElementAt(0);

            Assert.AreEqual(group2.GroupImports.First().ImportsToMatch.ElementAt(0), connection.Import);
            Assert.AreEqual(1, connection.Exports.Count());
            Assert.AreEqual(group1.GroupExport.ProvidedExports.ElementAt(0), connection.Exports.ElementAt(0));

            connection = connections.ElementAt(1);
            Assert.AreEqual(group2.GroupImports.First().ImportsToMatch.ElementAt(1), connection.Import);
            Assert.AreEqual(2, connection.Exports.Count());
            Assert.That(
                connection.Exports,
                Is.EquivalentTo(
                    new List <ExportRegistrationId>
            {
                group1.GroupExport.ProvidedExports.ElementAt(1),
                group1.GroupExport.ProvidedExports.ElementAt(2),
            }));
        }
        public void AcceptsWithUnmatchedPartImport()
        {
            var repository = new Mock <IPluginRepository>();
            {
                repository.Setup(r => r.Parts())
                .Returns(s_Parts);
                repository.Setup(r => r.Part(It.IsAny <TypeIdentity>()))
                .Returns <TypeIdentity>(t => s_Parts.FirstOrDefault(p => p.Identity.Equals(t)));
                repository.Setup(r => r.Groups())
                .Returns(s_Groups);
                repository.Setup(r => r.Group(It.IsAny <GroupRegistrationId>()))
                .Returns <GroupRegistrationId>(id => s_Groups.FirstOrDefault(g => g.Id.Equals(id)));
            }

            var partImportEngine = new Mock <IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny <SerializableImportDefinition>(), It.IsAny <SerializableExportDefinition>()))
                .Returns(false);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);

            Assert.IsFalse(importEngine.Accepts(s_Groups[0].GroupImports.First(), s_Groups[1].GroupExport));
        }
        public void MatchingGroupsWithSelectionCriteria()
        {
            var repository = new Mock<IPluginRepository>();
            {
                repository.Setup(r => r.Parts())
                    .Returns(s_Parts);
                repository.Setup(r => r.Part(It.IsAny<TypeIdentity>()))
                    .Returns<TypeIdentity>(t => s_Parts.FirstOrDefault(p => p.Identity.Equals(t)));
                repository.Setup(r => r.Groups())
                    .Returns(s_Groups);
                repository.Setup(r => r.Group(It.IsAny<GroupRegistrationId>()))
                    .Returns<GroupRegistrationId>(id => s_Groups.FirstOrDefault(g => g.Id.Equals(id)));
            }

            var partImportEngine = new Mock<IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny<SerializableImportDefinition>(), It.IsAny<SerializableExportDefinition>()))
                    .Returns(true);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            var groups = importEngine.MatchingGroups(new Dictionary<string, object>());

            Assert.AreEqual(3, groups.Count());
        }
        public void GenerateConnectionForWithSingleConnection()
        {
            var repository = new Mock<IPluginRepository>();
            var partImportEngine = new Mock<IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny<SerializableImportDefinition>(), It.IsAny<SerializableExportDefinition>()))
                    .Returns<SerializableImportDefinition, SerializableExportDefinition>(
                        (import, export) => import.ContractName == export.ContractName);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            var connections = importEngine.GenerateConnectionFor(s_Groups[0], s_Groups[0].GroupImports.First(), s_Groups[2]);

            Assert.AreEqual(1, connections.Count());

            var connection = connections.First();
            Assert.AreEqual(s_Groups[0].GroupImports.First().ImportsToMatch.First(), connection.Import);
            Assert.AreEqual(1, connection.Exports.Count());
            Assert.AreEqual(s_Groups[2].GroupExport.ProvidedExports.First(), connection.Exports.First());
        }
        public void GenerateConnectionForWithMultipleConnections()
        {
            var group1 = CreateExportingGroup();
            var group2 = CreateImportingGroup();

            var repository = new Mock<IPluginRepository>();
            var partImportEngine = new Mock<IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny<SerializableImportDefinition>(), It.IsAny<SerializableExportDefinition>()))
                    .Returns<SerializableImportDefinition, SerializableExportDefinition>(
                        (import, export) => import.ContractName == export.ContractName);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            var connections = importEngine.GenerateConnectionFor(group2, group2.GroupImports.First(), group1);

            Assert.AreEqual(2, connections.Count());

            var connection = connections.ElementAt(0);
            Assert.AreEqual(group2.GroupImports.First().ImportsToMatch.ElementAt(0), connection.Import);
            Assert.AreEqual(1, connection.Exports.Count());
            Assert.AreEqual(group1.GroupExport.ProvidedExports.ElementAt(0), connection.Exports.ElementAt(0));

            connection = connections.ElementAt(1);
            Assert.AreEqual(group2.GroupImports.First().ImportsToMatch.ElementAt(1), connection.Import);
            Assert.AreEqual(2, connection.Exports.Count());
            Assert.That(
                connection.Exports,
                Is.EquivalentTo(
                    new List<ExportRegistrationId>
                    {
                        group1.GroupExport.ProvidedExports.ElementAt(1),
                        group1.GroupExport.ProvidedExports.ElementAt(2),
                    }));
        }
        public void ExportMatchesSelectionCriteriaWithoutMatch()
        {
            var repository = new Mock<IPluginRepository>();
            {
                repository.Setup(r => r.Parts())
                    .Returns(s_Parts);
                repository.Setup(r => r.Part(It.IsAny<TypeIdentity>()))
                    .Returns<TypeIdentity>(t => s_Parts.FirstOrDefault(p => p.Identity.Equals(t)));
                repository.Setup(r => r.Groups())
                    .Returns(s_Groups);
                repository.Setup(r => r.Group(It.IsAny<GroupRegistrationId>()))
                    .Returns<GroupRegistrationId>(id => s_Groups.FirstOrDefault(g => g.Id.Equals(id)));
            }

            var partImportEngine = new Mock<IConnectParts>();
            {
                partImportEngine.Setup(i => i.Accepts(It.IsAny<SerializableImportDefinition>(), It.IsAny<SerializableExportDefinition>()))
                    .Returns(true);
            }

            var importEngine = new GroupImportEngine(repository.Object, partImportEngine.Object);
            Assert.IsFalse(
                importEngine.ExportPassesSelectionCriteria(
                    s_Groups.First().GroupExport,
                    new Dictionary<string, object> { { "a", new object() } }));
        }