示例#1
0
        /// <summary>
        ///     Returns a list of <see cref="MutationVariant" /> that can be executed on this given test project duplication.
        /// </summary>
        /// <param name="mutationIdentifiers"></param>
        /// <param name="mutationLevel"></param>
        /// <returns></returns>
        public IList <MutationVariant> GetMutationVariants(IList <MutationVariantIdentifier> mutationIdentifiers,
                                                           MutationLevel mutationLevel)
        {
            var foundMutations = new List <MutationVariant>();

            foreach (var reference in TestProjectReferences)
            {
                // Read the reference its contents
                using var stream    = reference.OpenReadStream();
                using var binReader = new BinaryReader(stream);
                var data = binReader.ReadBytes((int)stream.Length);

                var decompiler = new CodeDecompiler(reference.FullFilePath(), new MemoryStream(data));

                // Create assembly mutator and look up the mutations according to the passed identifiers.
                var assembly = new AssemblyMutator(new MemoryStream(data));

                foreach (var type in assembly.Types)
                {
                    var toMutateMethods = new HashSet <string>(
                        mutationIdentifiers.Select(x => x.MemberName)
                        );

                    foreach (var method in type.Methods)
                    {
                        if (!toMutateMethods.Contains(method.AssemblyQualifiedName))
                        {
                            continue;
                        }

                        var methodMutationId = 0;

                        foreach (var group in method.AllMutations(mutationLevel))
                        {
                            foreach (var mutation in group)
                            {
                                var mutationIdentifier = mutationIdentifiers.FirstOrDefault(x =>
                                                                                            x.MutationId == methodMutationId && method.AssemblyQualifiedName == x.MemberName);

                                if (mutationIdentifier.MemberName != null)
                                {
                                    foundMutations.Add(new MutationVariant(false, assembly, mutationIdentifier,
                                                                           new MutationAnalyzerInfo
                                    {
                                        AnalyzerDescription = group.AnalyzerDescription,
                                        AnalyzerName        = group.AnalyzerName
                                    }, method.Handle, mutation, "", decompiler.Decompile(method.Handle)));
                                }

                                methodMutationId++;
                            }
                        }
                    }
                }
            }

            return(foundMutations);
        }
示例#2
0
        public void AssemblyMutator_Has_Right_Types()
        {
            using Stream stream = new MemoryStream(File.ReadAllBytes("test.dll"));
            using var mutator   = new AssemblyMutator(stream);

            Assert.AreEqual(mutator.Types.Count, 2);
            Assert.AreEqual(mutator.Types[0].AssemblyQualifiedName, _nameSpaceTestAssemblyTarget1);
            Assert.AreEqual(mutator.Types[1].AssemblyQualifiedName, _nameSpaceTestAssemblyTarget2);
        }
示例#3
0
        public void AssemblyMutator_Type_TestAssemblyTarget2_Has_Right_Fields()
        {
            using Stream stream = new MemoryStream(File.ReadAllBytes("test.dll"));
            using var mutator   = new AssemblyMutator(stream);
            var target1 = mutator.Types.First(x =>
                                              x.AssemblyQualifiedName == _nameSpaceTestAssemblyTarget2);

            Assert.AreEqual(target1.Fields.Count, 2); // ctor, cctor, two target methods.
            Assert.IsNotNull(target1.Fields.FirstOrDefault(x => x.Name == "Constant"), null);
            Assert.IsNotNull(target1.Fields.FirstOrDefault(x => x.Name == "Static"), null);
        }
示例#4
0
        public void AssemblyMutator_Type_TestAssemblyTarget2_Has_Right_Methods()
        {
            using Stream stream = new MemoryStream(File.ReadAllBytes("test.dll"));
            using var mutator   = new AssemblyMutator(stream);
            var target1 = mutator.Types.First(x =>
                                              x.AssemblyQualifiedName == _nameSpaceTestAssemblyTarget2);

            Assert.AreEqual(target1.Methods.Count, 4);
            Assert.IsNotNull(target1.Methods.FirstOrDefault(x => x.Name == "TestMethod1"), null);
            Assert.IsNotNull(target1.Methods.FirstOrDefault(x => x.Name == "TestMethod2"), null);
        }
示例#5
0
        public void AssemblyMutator_Type_TestAssemblyTarget1_Constant_Has_Right_Mutation()
        {
            using Stream stream = new MemoryStream(File.ReadAllBytes("test.dll"));
            using var mutator   = new AssemblyMutator(stream);
            var target1 = mutator.Types.First(x =>
                                              x.AssemblyQualifiedName == _nameSpaceTestAssemblyTarget1);
            var field     = target1.Fields.FirstOrDefault(x => x.Name == "Constant");
            var mutations = field.ConstantFieldMutations(MutationLevel.Detailed);

            var arithmeticMutations =
                mutations.FirstOrDefault(x => x.AnalyzerName == new BooleanConstantMutationAnalyzer().Name);

            Assert.AreEqual(mutations.Count(), 1);
            Assert.IsNotNull(arithmeticMutations, null);
        }
示例#6
0
        public void AssemblyMutator_Type_TestAssemblyTarget1_TestMethod1_Has_Right_Mutations()
        {
            using Stream stream = new MemoryStream(File.ReadAllBytes("test.dll"));
            using var mutator   = new AssemblyMutator(stream);
            var target1 = mutator.Types.First(x =>
                                              x.AssemblyQualifiedName == _nameSpaceTestAssemblyTarget1);
            var method1   = target1.Methods.FirstOrDefault(x => x.Name == "TestMethod1");
            var mutations = method1.OpCodeMutations(MutationLevel.Detailed).Select(x => x).ToList();

            var arithmeticMutations =
                mutations.FirstOrDefault(x => x.AnalyzerName == new ArithmeticMutationAnalyzer().Name);
            var comparisonMutations =
                mutations.FirstOrDefault(x => x.AnalyzerName == new ComparisonMutationAnalyzer().Name);

            Assert.AreEqual(mutations.Count, 2);
            Assert.IsNotNull(arithmeticMutations, null);
            Assert.IsNotNull(comparisonMutations, null);
        }
示例#7
0
 public MutationVariant(
     bool causesTimeOut,
     AssemblyMutator assembly,
     MutationVariantIdentifier mutationIdentifier,
     MutationAnalyzerInfo mutationAnalyzerInfo,
     EntityHandle memberHandle,
     IMutation mutation,
     string mutatedSource,
     string originalSource
     )
 {
     CausesTimeOut        = causesTimeOut;
     Assembly             = assembly;
     MutationIdentifier   = mutationIdentifier;
     MutationAnalyzerInfo = mutationAnalyzerInfo;
     MemberHandle         = memberHandle;
     Mutation             = mutation;
     MutatedSource        = mutatedSource;
     OriginalSource       = originalSource;
 }
示例#8
0
        /// <summary>
        ///     Returns information about the test project.
        /// </summary>
        /// <returns></returns>
        private TestProjectInfo GetTestProjectInfo(TestProjectDuplication duplication, IProjectInfo testProjectInfo)
        {
            var testFramework = GetTestFramework(testProjectInfo);

            // Read the test project into memory.
            var projectInfo = new TestProjectInfo
            {
                TestFramework = testFramework,
                TestModule    = ModuleDefinition.ReadModule(duplication.TestProjectFile.FullFilePath())
            };

            // Foreach project reference load it in memory as an 'assembly mutator'.
            foreach (var projectReferencePath in duplication.TestProjectReferences)
            {
                var loadProjectReferenceModel = new AssemblyMutator(projectReferencePath.FullFilePath());

                if (loadProjectReferenceModel.Types.Count > 0)
                {
                    projectInfo.DependencyAssemblies.Add(loadProjectReferenceModel);
                }
            }

            return(projectInfo);
        }