示例#1
0
        public void Checks_syntax_errors(string[] sourceCode, int syntaxErrorCount)
        {
            CodeModelFactory factory = new CodeModelFactory();

            var project = factory.CreateProject(sourceCode);

            project.SyntaxErrors.Count.ShouldBe(syntaxErrorCount);
        }
示例#2
0
 public SmellDetectorService()
 {
     _codeModelFactory = new CodeModelFactory();
     _detectors        = new List <IDetector>
     {
         new ClassMetricRuleEngine()
     };
 }
示例#3
0
        public void Ignores_partial_classes()
        {
            CodeModelFactory factory = new CodeModelFactory();

            var classes = factory.CreateProject(_testDataFactory.GetTwoPartialClassesWithSameFullName()).Classes;

            classes.Count.ShouldBe(0);
        }
示例#4
0
        public void Evaluates_solution_submission(string[] submissionAttempt, List <ChallengeHint> expectedHints)
        {
            var project             = new CodeModelFactory().CreateProject(submissionAttempt);
            var challengeEvaluation = _basicMetricChecker.EvaluateSubmission(project.Classes);
            var actualHints         = challengeEvaluation.GetHints();

            actualHints.Count.ShouldBe(expectedHints.Count);
            actualHints.All(expectedHints.Contains).ShouldBeTrue();
        }
        public void Calculates_number_of_return_statements_in_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCodeBlocksClass()).Classes;

            var firstClass = classes.First();

            firstClass.Metrics[CaDETMetric.CNOR].ShouldBe(3);
        }
        public void Calculates_number_of_protected_fields_in_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCodeBlocksClass()).Classes;

            var firstClass = classes.First();

            firstClass.Metrics[CaDETMetric.NOPF].ShouldBe(2);
        }
示例#7
0
        private CaDETProject BuildCaDETModel(string[] sourceCode)
        {
            var solutionAttempt = new CodeModelFactory().CreateProject(sourceCode);

            if (solutionAttempt.Classes == null || solutionAttempt.Classes.Count == 0)
            {
                throw new InvalidOperationException("Invalid submission.");
            }
            return(solutionAttempt);
        }
        public void Calculates_max_nested_blocks_in_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCodeBlocksClass()).Classes;

            var firstClass = classes.First();

            firstClass.Metrics[CaDETMetric.CMNB].ShouldBe(4);
        }
        public void Calculates_weighted_methods_per_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetGitAdapterClassText()).Classes;

            var gitClass = classes.First();

            gitClass.Metrics[CaDETMetric.WMC].ShouldBe(17);
        }
示例#10
0
        public void Calculates_number_of_lambda_expressions()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCodeBlocksClass()).Classes;

            var firstClass = classes.First();

            firstClass.FindMember("CSharpCodeParserInit").Metrics[CaDETMetric.NOLE].ShouldBe(0);
            firstClass.FindMember("CreateClassMemberBuilders2").Metrics[CaDETMetric.NOLE].ShouldBe(2);
        }
示例#11
0
        public void Calculates_number_of_local_variables()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetGitAdapterClassText()).Classes;

            var gitClass = classes.First();

            gitClass.FindMember("CheckForNewCommits").Metrics[CaDETMetric.NOLV].ShouldBe(2);
            gitClass.FindMember("GetActiveCommit").Metrics[CaDETMetric.NOLV].ShouldBe(0);
        }
示例#12
0
        public void Calculates_member_effective_lines_of_code()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetEffectiveLinesOfCodeTest()).Classes;

            var doctor = classes.First();

            doctor.FindMember("Doctor").Metrics[CaDETMetric.MELOC].ShouldBe(1);
            doctor.FindMember("IsAvailable").Metrics[CaDETMetric.MELOC].ShouldBe(2);
        }
示例#13
0
        public void Calculates_method_cyclomatic_complexity()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetGitAdapterClassText()).Classes;

            var gitClass = classes.First();

            gitClass.FindMember("CheckoutCommit").Metrics[CaDETMetric.CYCLO].ShouldBe(2);
            gitClass.FindMember("ParseDocuments").Metrics[CaDETMetric.CYCLO].ShouldBe(4);
        }
示例#14
0
        public void Calculates_number_of_unique_words()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCodeBlocksClass()).Classes;

            var gitClass = classes.First();

            gitClass.FindMember("CSharpCodeParserInit").Metrics[CaDETMetric.NOUW].ShouldBe(5);
            gitClass.FindMember("CreateClassMemberBuilders1").Metrics[CaDETMetric.NOUW].ShouldBe(22);
            gitClass.FindMember("CreateClassMemberBuilders2").Metrics[CaDETMetric.NOUW].ShouldBe(33);
        }
示例#15
0
        public void Calculates_invoked_methods_in_a_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetMultipleClassTexts()).Classes;

            var dateRange = classes.Find(c => c.Name.Equals("DateRange"));
            var service   = classes.Find(c => c.Name.Equals("DoctorService"));

            dateRange.Metrics[CaDETMetric.RFC].ShouldBe(0);
            service.Metrics[CaDETMetric.RFC].ShouldBe(4);
        }
示例#16
0
        public void Calculates_lack_of_cohesion()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCohesionClasses()).Classes;

            var dateRange = classes.Find(c => c.Name.Equals("DateRange"));
            var doctor    = classes.Find(c => c.Name.Equals("Doctor"));

            dateRange.Metrics[CaDETMetric.LCOM].ShouldBe(0);
            doctor.Metrics[CaDETMetric.LCOM].ShouldBe(0.75);
        }
示例#17
0
        public void Calculates_lines_of_code_for_CSharp_class_elements()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetDoctorClassText()).Classes;

            var doctorClass = classes.First();

            doctorClass.Metrics[CaDETMetric.CLOC].ShouldBe(22);
            doctorClass.FindMember("Email").Metrics[CaDETMetric.MLOC].ShouldBe(1);
            doctorClass.FindMember("IsAvailable").Metrics[CaDETMetric.MLOC].ShouldBe(8);
        }
示例#18
0
        public void Create_code_model_with_links(string folderLocation)
        {
            CodeModelFactory factory = new CodeModelFactory();
            var project = factory.CreateProjectWithCodeFileLinks(folderLocation);

            var classes    = project.Classes.Select(c => c.FullName);
            var members    = project.Classes.SelectMany(c => c.Members).Select(m => m.Signature());
            var keys       = project.CodeLinks.Keys.ToList();
            var difference = classes.Union(members).Except(keys);

            difference.ShouldBeEmpty();
        }
示例#19
0
        public void Calculates_max_nested_blocks()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetCodeBlocksClass()).Classes;

            var firstClass = classes.First();

            firstClass.FindMember("CSharpCodeParserInit").Metrics[CaDETMetric.MMNB].ShouldBe(0);
            firstClass.FindMember("CreateClassMemberBuilders1").Metrics[CaDETMetric.MMNB].ShouldBe(2);
            firstClass.FindMember("CreateClassMemberBuilders2").Metrics[CaDETMetric.MMNB].ShouldBe(4);
            firstClass.FindMember("CreateClassMemberBuilders3").Metrics[CaDETMetric.MMNB].ShouldBe(4);
        }
示例#20
0
        public void Calculates_number_of_parameters()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetGitAdapterClassText()).Classes;

            var gitClass = classes.First();

            gitClass.FindMember("CheckForNewCommits").Metrics[CaDETMetric.NOP].ShouldBe(0);
            gitClass.FindMember("PullChanges").Metrics[CaDETMetric.NOP].ShouldBe(0);
            gitClass.FindMember("GetCommits").Metrics[CaDETMetric.NOP].ShouldBe(1);
            gitClass.FindMember("CheckoutCommit").Metrics[CaDETMetric.NOP].ShouldBe(1);
        }
示例#21
0
        public void Calculates_array_element_accessed_accessor()
        {
            //CURRENTLY NOT SUPPORTED - ergo tests fail.
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetMultipleClassTexts()).Classes;

            var doctor       = classes.Find(c => c.Name.Equals("Doctor"));
            var service      = classes.Find(c => c.Name.Equals("DoctorService"));
            var holidayDates = doctor.FindMember("HolidayDates");
            var logChecked   = service.FindMember("LogChecked");

            logChecked.AccessedAccessors.ShouldContain(holidayDates);
        }
示例#22
0
        public void Calculates_tight_class_cohesion()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetTCCMultipleClassTexts()).Classes;

            var class6 = classes.Find(c => c.Name.Equals("Class6"));
            var class7 = classes.Find(c => c.Name.Equals("Class7"));
            var class8 = classes.Find(c => c.Name.Equals("Class8"));

            class6.Metrics[CaDETMetric.TCC].ShouldBe(0.67);
            class7.Metrics[CaDETMetric.TCC].ShouldBe(0.5);
            class8.Metrics[CaDETMetric.TCC].ShouldBe(0.5);
        }
示例#23
0
        public void Calculates_number_of_dependencies_in_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetMultipleClassTexts()).Classes;

            var dataRange     = classes.Find(c => c.Name.Equals("DateRange"));
            var doctor        = classes.Find(c => c.Name.Equals("Doctor"));
            var doctorService = classes.Find(c => c.Name.Equals("DoctorService"));

            dataRange.Metrics[CaDETMetric.CBO].ShouldBe(2);
            doctor.Metrics[CaDETMetric.CBO].ShouldBe(2);
            doctorService.Metrics[CaDETMetric.CBO].ShouldBe(2);
        }
示例#24
0
        public void Determines_if_is_data_class()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetMultipleClassTexts()).Classes;

            var doctor    = classes.Find(c => c.Name.Equals("Doctor"));
            var service   = classes.Find(c => c.Name.Equals("DoctorService"));
            var dateRange = classes.Find(c => c.Name.Equals("DateRange"));

            dateRange.IsDataClass().ShouldBeFalse();
            doctor.IsDataClass().ShouldBeFalse();
            service.IsDataClass().ShouldBeFalse();
        }
示例#25
0
        public void Build_code_model_from_repository()
        {
            CodeModelFactory factory = new CodeModelFactory();

            var project = factory.CreateProject("C:/repo");

            project.Classes.ShouldNotBeEmpty();
            CaDETClass conflict = project.Classes.Find(c => c.FullName.Equals("LibGit2Sharp.Conflict"));

            conflict.ShouldNotBeNull();
            conflict.Fields.ShouldContain(f => f.Name.Equals("ancestor"));
            conflict.Fields.ShouldContain(f => f.Name.Equals("ours"));
            conflict.Fields.ShouldContain(f => f.Name.Equals("theirs"));
            conflict.Members.ShouldContain(m =>
                                           m.Name.Equals("Conflict") && m.Type.Equals(CaDETMemberType.Constructor) && m.AccessedFields.Count == 3);
            conflict.Members.ShouldContain(m =>
                                           m.Name.Equals("Equals") && m.Type.Equals(CaDETMemberType.Method) && m.AccessedFields.Count == 1);
            conflict.Metrics[CaDETMetric.CLOC].ShouldBe(108);
            conflict.Metrics[CaDETMetric.LCOM].ShouldBe(0.833);
            conflict.Metrics[CaDETMetric.NAD].ShouldBe(4);
            conflict.Metrics[CaDETMetric.NMD].ShouldBe(3);
            conflict.Metrics[CaDETMetric.WMC].ShouldBe(8);
            CaDETClass certificate = project.Classes.Find(c => c.FullName.Equals("LibGit2Sharp.Certificate"));

            certificate.ShouldNotBeNull();
            certificate.Members.ShouldBeEmpty();
            certificate.Fields.ShouldBeEmpty();
            certificate.Metrics[CaDETMetric.LCOM].ShouldBe(-1);
            certificate.Metrics[CaDETMetric.CLOC].ShouldBe(3);
            certificate.Metrics[CaDETMetric.NAD].ShouldBe(0);
            certificate.Metrics[CaDETMetric.NMD].ShouldBe(0);
            certificate.Metrics[CaDETMetric.WMC].ShouldBe(0);
            CaDETClass handles =
                project.Classes.Find(c => c.FullName.Equals("LibGit2Sharp.Core.Handles.Libgit2Object"));

            handles.ShouldNotBeNull();
            handles.Fields.ShouldContain(f => f.Name.Equals("ptr"));
            handles.Members.ShouldContain(m => m.Name.Equals("Handle") && m.Type.Equals(CaDETMemberType.Property));
            handles.Members.ShouldContain(m => m.Name.Equals("Dispose") && m.Type.Equals(CaDETMemberType.Method) &&
                                          m.InvokedMethods.Count == 1 &&
                                          m.AccessedFields.Count == 0 &&
                                          m.AccessedAccessors.Count == 0);
            handles.Metrics[CaDETMetric.LCOM].ShouldBe(0.667);
            handles.Metrics[CaDETMetric.CLOC].ShouldBe(100);
            handles.Metrics[CaDETMetric.NAD].ShouldBe(3);
            handles.Metrics[CaDETMetric.NMD].ShouldBe(4);
            handles.Metrics[CaDETMetric.WMC].ShouldBe(10);
        }
示例#26
0
        public void Establishes_correct_class_hierarchy()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetClassesWithHierarchy()).Classes;

            var doctor   = classes.Find(c => c.Name.Equals("Doctor"));
            var employee = classes.Find(c => c.Name.Equals("Employee"));
            var entity   = classes.Find(c => c.Name.Equals("Entity"));

            doctor.Parent.ShouldBe(employee);
            employee.Parent.ShouldBe(entity);
            entity.Parent.ShouldBeNull();
            doctor.FindMember("Doctor").AccessedAccessors.ShouldContain(employee.FindMember("Email"));
            employee.FindMember("Employee").AccessedAccessors.ShouldContain(entity.FindMember("Id"));
        }
示例#27
0
        public void Checks_method_signature()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetMultipleClassTexts()).Classes;

            var doctor       = classes.Find(c => c.Name.Equals("Doctor"));
            var dateRange    = classes.Find(c => c.Name.Equals("DateRange"));
            var service      = classes.Find(c => c.Name.Equals("DoctorService"));
            var holidayDates = doctor.FindMember("HolidayDates");
            var overlapsWith = dateRange.FindMember("OverlapsWith");
            var findDoctors  = service.FindMember("FindAvailableDoctor");

            holidayDates.Signature().Equals("HolidayDates");
            overlapsWith.Signature().Equals("OverlapsWith(DoctorApp.Model.Data.DateR.DateRange)");
            findDoctors.Signature().Equals("FindAvailableDoctor(DoctorApp.Model.Data.DateR.DateRange)");
        }
示例#28
0
        public void Create_code_model_with_links_on_large_repo()
        {
            CodeModelFactory factory = new CodeModelFactory();
            var project = factory.CreateProjectWithCodeFileLinks("C:/repo");

            var projectClassesAndMembersCount = project.Classes.Count + project.Classes.Sum(c => c.Members.Count);

            project.CodeLinks.Count.ShouldBe(projectClassesAndMembersCount);
            project.CodeLinks.TryGetValue("LibGit2Sharp.ObjectDatabase", out var locationLink);
            locationLink.StartLoC.ShouldBe(17);
            locationLink.EndLoC.ShouldBe(1091);
            project.CodeLinks.TryGetValue("LibGit2Sharp.ObjectDatabase.RevertCommit(LibGit2Sharp.Commit, LibGit2Sharp.Commit, int, LibGit2Sharp.MergeTreeOptions)", out locationLink);
            locationLink.StartLoC.ShouldBe(1026);
            locationLink.EndLoC.ShouldBe(1090);
            project.CodeLinks.TryGetValue("LibGit2Sharp.MergeTreeOptions.MergeTreeOptions()", out locationLink);
            locationLink.StartLoC.ShouldBe(15);
            locationLink.EndLoC.ShouldBe(16);
        }
示例#29
0
        public void Checks_method_linked_return_types()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes      = factory.CreateProject(_testDataFactory.GetMultipleClassTexts()).Classes;
            List <CaDETClass> otherClasses = factory.CreateProject(_testDataFactory.GetClassesFromDifferentNamespace()).Classes;

            var dateRange      = classes.Find(c => c.Name.Equals("DateRange"));
            var doctor         = classes.Find(c => c.Name.Equals("Doctor"));
            var doctorService  = classes.Find(c => c.Name.Equals("DoctorService"));
            var otherDoctor    = otherClasses.Find(c => c.Name.Equals("Doctor"));
            var otherDateRange = otherClasses.Find(c => c.Name.Equals("DateRange"));

            doctor.FindMember("TestFunction").GetLinkedReturnTypes().ShouldContain(dateRange);
            doctor.FindMember("TestFunction").GetLinkedReturnTypes().ShouldNotContain(otherDateRange);
            doctorService.FindMember("FindAvailableDoctor").GetLinkedReturnTypes().ShouldContain(doctor);
            doctorService.FindMember("FindAvailableDoctor").GetLinkedReturnTypes().ShouldNotContain(otherDoctor);
        }
示例#30
0
        public void Calculates_access_to_foreign_data()
        {
            CodeModelFactory factory = new CodeModelFactory();

            List <CaDETClass> classes = factory.CreateProject(_testDataFactory.GetATFDMultipleClassTexts()).Classes;

            var class1 = classes.Find(c => c.Name.Equals("Class1"));
            var class3 = classes.Find(c => c.Name.Equals("Class3"));
            var class5 = classes.Find(c => c.Name.Equals("Class5"));
            var class7 = classes.Find(c => c.Name.Equals("Class7"));
            var class9 = classes.Find(c => c.Name.Equals("Class9"));

            class1.Metrics[CaDETMetric.ATFD].ShouldBe(2);
            class3.Metrics[CaDETMetric.ATFD].ShouldBe(1);
            class5.Metrics[CaDETMetric.ATFD].ShouldBe(1);
            class7.Metrics[CaDETMetric.ATFD].ShouldBe(3);
            class9.Metrics[CaDETMetric.ATFD].ShouldBe(2);
        }