public void GetViolatingOccurrences_Success_CanNotRelate()
        {
            var architectureRule = new ArchitecturalRule()
            {
                OriginLayer  = "Origin",
                TargetLayer  = "Target",
                RuleOperator = RuleOperator.CanNotRelate
            };

            var targetNamespace     = "Test.Target";
            var targetStructureName = "TargetTestStructure";

            var originStructure = new Structure()
            {
                Name       = "OriginTestStructure",
                Type       = StructureType.Class,
                Namespace  = "Test.Origin",
                References = new List <string>()
                {
                    { targetNamespace }
                },
                Relations = new List <Relation>()
                {
                    new Relation(RelationType.Inheritance,
                                 targetNamespace, true, targetStructureName)
                }
            };

            var layersNamespaces = new Dictionary <string, IEnumerable <string> >()
            {
                { "Origin", new List <string>()
                  {
                      originStructure.Namespace
                  } },
                { "Target", new List <string>()
                  {
                      targetNamespace
                  } }
            };

            var structures = new List <Structure>()
            {
                originStructure,
                new Structure()
                {
                    Name      = targetStructureName,
                    Type      = StructureType.Class,
                    Namespace = targetNamespace
                }
            };

            var violatingOccurrences = ArchitecturalRuleHelper.GetViolatingOccurrences(
                architectureRule, layersNamespaces, structures);

            AssertViolatingOccurrences(violatingOccurrences, originStructure,
                                       $"{targetNamespace}.{targetStructureName}");
        }
        public void GetViolatingOccurrences_Success_NeedToRelate()
        {
            var architectureRule = new ArchitecturalRule()
            {
                OriginLayer  = "Origin",
                TargetLayer  = "Target",
                RuleOperator = RuleOperator.NeedToRelate
            };

            var targetNamespace     = "Test.Target";
            var targetStructureName = "TargetTestStructure";

            var originStructure = new Structure()
            {
                Name      = "OriginTestStructure",
                Type      = StructureType.Class,
                Namespace = "Test.Origin"
            };

            var layersNamespaces = new Dictionary <string, IEnumerable <string> >()
            {
                { "Origin", new List <string>()
                  {
                      originStructure.Namespace
                  } },
                { "Target", new List <string>()
                  {
                      targetNamespace
                  } }
            };

            var structures = new List <Structure>()
            {
                originStructure,
                new Structure()
                {
                    Name      = targetStructureName,
                    Type      = StructureType.Class,
                    Namespace = targetNamespace
                }
            };

            var violatingOccurrences = ArchitecturalRuleHelper.GetViolatingOccurrences(
                architectureRule, layersNamespaces, structures);

            Assert.NotNull(violatingOccurrences);
            Assert.Single(violatingOccurrences);

            Assert.Equal($"{originStructure.Namespace}.{originStructure.Name}",
                         violatingOccurrences.Single().Structure);
            Assert.Empty(violatingOccurrences.Single().NonConformingRelations);
        }
        public void GetViolatingOccurrences_Success_OnlyCanRelate_Empty()
        {
            var architectureRule = new ArchitecturalRule()
            {
                OriginLayer  = "Origin",
                TargetLayer  = "Target",
                RuleOperator = RuleOperator.OnlyCanRelate
            };

            var targetNamespace = "Test.Target";

            var layersNamespaces = new Dictionary <string, IEnumerable <string> >()
            {
                { "Origin", new List <string>()
                  {
                      "Test.Origin"
                  } },
                { "Target", new List <string>()
                  {
                      targetNamespace
                  } }
            };

            var structures = new List <Structure>()
            {
                new Structure()
                {
                    Name       = "TargetStructure",
                    Type       = StructureType.Class,
                    Namespace  = targetNamespace,
                    References = new List <string>()
                    {
                        { targetNamespace }
                    },
                    Relations = new List <Relation>()
                    {
                        new Relation(RelationType.Inheritance,
                                     targetNamespace, true, "AnotherTargetStructure")
                    }
                }
            };

            var violatingOccurrences = ArchitecturalRuleHelper.GetViolatingOccurrences(
                architectureRule, layersNamespaces, structures);

            Assert.NotNull(violatingOccurrences);
            Assert.Empty(violatingOccurrences);
        }
Exemple #4
0
        private static IEnumerable <TransgressedRule> GetTransgressedRulesByConstraintsAndCodeFiles(
            ArchitecturalConstraints constraints, ICollection <CodeFile> codeFiles)
        {
            var structures = codeFiles.SelectMany(c => c.Structures);
            var namespaces = structures.Select(s => s.Namespace).Distinct();

            var layersNamespaces = NamespacesGroupingMethodHelper
                                   .GetLayersNamespaces(constraints.Layers, namespaces);

            foreach (var rule in constraints.Rules)
            {
                var violatingOccurrences = ArchitecturalRuleHelper
                                           .GetViolatingOccurrences(rule, layersNamespaces, structures);

                if (violatingOccurrences.Any())
                {
                    yield return(new TransgressedRule()
                    {
                        Rule = rule,
                        Violations = violatingOccurrences
                    });
                }
            }
        }
        public void GetViolatingOccurrences_Success_Empty()
        {
            var architecturalRules = new ArchitecturalRule[]
            {
                new ArchitecturalRule()
                {
                    OriginLayer   = "X",
                    TargetLayer   = "Y",
                    RuleOperator  = RuleOperator.CanNotRelate,
                    RelationTypes = new List <RelationType>()
                    {
                        RelationType.Declarate
                    }
                },
                new ArchitecturalRule()
                {
                    OriginLayer   = "X",
                    TargetLayer   = "Z",
                    RuleOperator  = RuleOperator.OnlyCanRelate,
                    RelationTypes = new List <RelationType>()
                    {
                        RelationType.Inheritance
                    }
                },
                new ArchitecturalRule()
                {
                    OriginLayer   = "W",
                    TargetLayer   = "Z",
                    RuleOperator  = RuleOperator.OnlyNeedToRelate,
                    RelationTypes = new List <RelationType>()
                    {
                        RelationType.ReceiptByConstructorArgument
                    }
                }
            };

            var structures = new List <Structure>()
            {
                new Structure()
                {
                    Name      = "XStructure",
                    Type      = StructureType.Class,
                    Namespace = "X",
                    Relations = new List <Relation>()
                    {
                        new Relation(RelationType.Inheritance,
                                     "Y", true, "YStructure")
                    }
                },
                new Structure()
                {
                    Name      = "YStructure",
                    Type      = StructureType.Class,
                    Namespace = "Y",
                    Relations = new List <Relation>()
                    {
                        new Relation(RelationType.Indirect,
                                     "Z", true, "ZStructure")
                    }
                }
            };

            var layersNamespaces = new Dictionary <string, IEnumerable <string> >()
            {
                { "X", new List <string>()
                  {
                      "X"
                  } },
                { "Y", new List <string>()
                  {
                      "Y"
                  } },
                { "W", new List <string>()
                  {
                      "W"
                  } },
                { "Z", new List <string>()
                  {
                      "Z"
                  } }
            };

            foreach (var rule in architecturalRules)
            {
                var violatingOccurrences = ArchitecturalRuleHelper
                                           .GetViolatingOccurrences(rule, layersNamespaces, structures);

                Assert.Empty(violatingOccurrences);
            }
        }