Пример #1
0
 public LocalVariableDeclarationMutator(SyntaxNode classRootNode, MutantCreator mutantCreator,
                                        SemanticModel semanticModel, RandomTypeGenerator randomTypeGenerator)
 {
     _classRootNode       = classRootNode;
     _mutantCreator       = mutantCreator;
     _semanticModel       = semanticModel;
     _randomTypeGenerator = randomTypeGenerator;
 }
Пример #2
0
 public AssignmentExprMutator(SyntaxNode classRootNode, MutantCreator mutantCreator,
                              SemanticModel semanticModel, RandomTypeGenerator randomTypeGenerator)
 {
     _classRootNode       = classRootNode;
     _mutantCreator       = mutantCreator;
     _semanticModel       = semanticModel;
     _randomTypeGenerator = randomTypeGenerator;
 }
Пример #3
0
        private List <GeneratedMutant> GenerateMutantsForProject(
            Compilation projectAssembly,
            SemanticModel projectSemanticModel,
            List <string> options,
            Workspace workspace,
            List <Class> projectClasses,
            Solution solution,
            string projectOutputFilePath)
        {
            var generatedMutants = new List <GeneratedMutant>();

            foreach (var syntaxTree in projectAssembly.SyntaxTrees)
            {
                var root       = syntaxTree.GetRoot() as CompilationUnitSyntax;
                var namespaces = root.DescendantNodes().OfType <NamespaceDeclarationSyntax>().ToList();

                foreach (NamespaceDeclarationSyntax ns in namespaces)
                {
                    var namespaceClasses  = ns.DescendantNodes().OfType <ClassDeclarationSyntax>().ToList();
                    var namespaceTreeRoot = ns.SyntaxTree.GetRoot();

                    var name = ns.Name.NormalizeWhitespace().ToFullString();

                    if (!name.Contains("DbObject"))
                    {
                        if (namespaceClasses.Count != 0)
                        {
                            Usings.AddRange(namespaceTreeRoot.DescendantNodes()
                                            .OfType <UsingDirectiveSyntax>().ToList());
                            var selfUsing = CreateUsingDirective(name);

                            selfUsing = selfUsing.WithUsingKeyword(
                                selfUsing.UsingKeyword.WithTrailingTrivia(
                                    SyntaxFactory.Whitespace(" ")));

                            Usings.Add(selfUsing);

                            foreach (ClassDeclarationSyntax cls in namespaceClasses)
                            {
                                var classMethods = cls.DescendantNodes().OfType <MethodDeclarationSyntax>().ToList();

                                if (classMethods.Count != 0)
                                {
                                    var className     = cls.Identifier.Value.ToString();
                                    var mutantCreator = new MutantCreator(className, cls);

                                    var typeResolver = new RandomTypeGenerator(projectClasses);

                                    //mutate boundary operators
                                    if (options.Contains("1"))
                                    {
                                        mutantCreator.MutatorType = "BOM";
                                        var boundaryOpMutator = new BoundaryOpMutator
                                                                    (cls, mutantCreator);
                                        boundaryOpMutator.Visit(cls);
                                    }

                                    //nagate relational and equality operators
                                    if (options.Contains("2"))
                                    {
                                        mutantCreator.MutatorType = "REOM";
                                        var relationalAndEqOpMutator = new RelationalAndEqualityOpMutator
                                                                           (cls, mutantCreator);
                                        relationalAndEqOpMutator.Visit(cls);
                                    }

                                    //mutate non basic conditionals
                                    if (options.Contains("3"))
                                    {
                                        //replace complex boolean expressions with true or false
                                        mutantCreator.MutatorType = "RNBCM";
                                        var conditionaleMutator = new RemoveNonBasicConditionalsMutator
                                                                      (cls, mutantCreator);
                                        conditionaleMutator.Visit(cls);
                                    }

                                    //mutate math operators
                                    if (options.Contains("4"))
                                    {
                                        mutantCreator.MutatorType = "MOM";
                                        var mathOperatorMutator = new MathOperatorsMutator
                                                                      (cls, mutantCreator, projectSemanticModel);
                                        mathOperatorMutator.Visit(cls);
                                    }

                                    //mutate assignment expressions
                                    if (options.Contains("5"))
                                    {
                                        //replace an assignment expression right part with the
                                        //default value for the desired type
                                        mutantCreator.MutatorType = "AEM";
                                        var assignmentExprMutator = new AssignmentExprMutator
                                                                        (cls, mutantCreator, projectSemanticModel, typeResolver);
                                        assignmentExprMutator.Visit(cls);
                                    }

                                    //mutate return statements
                                    if (options.Contains("6"))
                                    {
                                        //replace an return statement
                                        //value with a random generated value for that type
                                        mutantCreator.MutatorType = "REM";
                                        var returnStatementMutator = new ReturnExpressionMutator
                                                                         (cls, mutantCreator, projectSemanticModel, typeResolver);
                                        returnStatementMutator.Visit(cls);
                                    }

                                    //mutate void method calls
                                    if (options.Contains("7"))
                                    {
                                        //remove void mthod calls statements
                                        mutantCreator.MutatorType = "VMCM";
                                        var voidMethodCallMutator = new VoidMethodCallMutator
                                                                        (cls, mutantCreator, projectSemanticModel);
                                        voidMethodCallMutator.Visit(cls);
                                    }

                                    if (options.Contains("8") && !options.Contains("5"))
                                    {
                                        //deletes all class's members assignments (global variables assignments)
                                        mutantCreator.MutatorType = "CMAD";
                                        var classFields = namespaceClasses.ElementAt(0)
                                                          .DescendantNodes().OfType <FieldDeclarationSyntax>().ToList();

                                        var classFieldsIdentifiers = new List <string>();
                                        foreach (FieldDeclarationSyntax field in classFields)
                                        {
                                            classFieldsIdentifiers.Add(
                                                field.Declaration.Variables.First().Identifier.ToString());
                                        }

                                        var classMembersAssignmentsDeletion = new ClassMemberAssignDel
                                                                                  (cls, mutantCreator, classFieldsIdentifiers);
                                        classMembersAssignmentsDeletion.Visit(cls);
                                    }

                                    //mutate local variable declaration with initializer statements
                                    if (options.Contains("9"))
                                    {
                                        mutantCreator.MutatorType = "LVDM";
                                        var voidMethodCallMutator = new LocalVariableDeclarationMutator
                                                                        (cls, mutantCreator, projectSemanticModel, typeResolver);
                                        voidMethodCallMutator.Visit(cls);
                                    }

                                    generatedMutants.AddRange(mutantCreator.GetMutatedClasses());
                                }
                            }
                        }
                    }
                    //else
                    //{
                    //    MessageBox.Show(string.Format("Ignored namespace: {0}", name));
                    //}
                }
            }

            return(generatedMutants);
        }