public void Mutate_Creates_And_Destroys_Directories()
        {
            var assembly = CreateTestAssembly();

            var addMethod = assembly.MainModule
                            .Types.Single(t => t.Name == "TestClass")
                            .Methods.Single(t => t.Name == "TestMethod");

            string tempAssemblyFileName = GetTempAssemblyFileName();

            assembly.Write(tempAssemblyFileName);
            var module = new Module(tempAssemblyFileName);

            var mutator = new DummyTurtle();
            IEnumerable <MutantMetaData> mutations = mutator
                                                     .Mutate(addMethod, module, addMethod.Body.Instructions.Select(i => i.Offset).ToArray());

            var directories = new List <string>();

            foreach (var mutation in mutations)
            {
                string directoryName = mutation.TestDirectoryName;
                directories.Add(directoryName);
                Assert.IsTrue(Directory.Exists(directoryName));
                mutator.MutantComplete(mutation);
            }

            foreach (var directory in directories)
            {
                Assert.IsFalse(Directory.Exists(directory));
            }
        }
        public void DoYield_Saves_Assembly()
        {
            var assembly = CreateTestAssembly();
            var turtle   = new DummyTurtle();
            var method   = assembly.MainModule.Types
                           .Single(t => t.Name == "TestClass")
                           .Methods.Single(m => m.Name == "TestMethod");

            string tempAssemblyFileName = GetTempAssemblyFileName();

            assembly.Write(tempAssemblyFileName);
            var originalFile = File.ReadAllBytes(tempAssemblyFileName);

            Thread.Sleep(1);
            var module = new Module(tempAssemblyFileName);

            method = module.Definition
                     .Types.First(t => t.Name == "TestClass")
                     .Methods.First(m => m.Name == "TestMethod");

            var    mutation = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).First();
            string mutatedAssemblyFileName = Path.Combine(mutation.TestDirectory.FullName,
                                                          Path.GetFileName(tempAssemblyFileName));
            var newFile = File.ReadAllBytes(mutatedAssemblyFileName);

            Assert.IsFalse(Enumerable.SequenceEqual(originalFile, newFile));
        }
        public void Mutate_Simplifies_Macros_In_IL()
        {
            var assembly = CreateTestAssembly();
            var turtle   = new DummyTurtle();
            var method   = assembly.MainModule.Types
                           .Single(t => t.Name == "TestClass")
                           .Methods.Single(m => m.Name == "TestMethod");

            string tempAssemblyFileName = GetTempAssemblyFileName();

            assembly.Write(tempAssemblyFileName);
            var module = new Module(tempAssemblyFileName);

            var mutation = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).First();

            Assert.AreEqual(OpCodes.Ldarg, mutation.MethodDefinition.Body.Instructions[0].OpCode);
        }
        public void Mutate_Simplifies_Macros_In_IL()
        {
            var assembly = CreateTestAssembly();
            var turtle = new DummyTurtle();
            var method = assembly.MainModule.Types
                .Single(t => t.Name == "TestClass")
                .Methods.Single(m => m.Name == "TestMethod");

            string tempAssemblyFileName = GetTempAssemblyFileName();
            assembly.Write(tempAssemblyFileName);
            var module = new Module(tempAssemblyFileName);

            var mutation = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).First();
            Assert.AreEqual(OpCodes.Ldarg, mutation.MethodDefinition.Body.Instructions[0].OpCode);
        }
        public void Mutate_Creates_And_Destroys_Directories()
        {
            var assembly = CreateTestAssembly();

            var addMethod = assembly.MainModule
                .Types.Single(t => t.Name == "TestClass")
                .Methods.Single(t => t.Name == "TestMethod");

            string tempAssemblyFileName = GetTempAssemblyFileName();
            assembly.Write(tempAssemblyFileName);
            var module = new Module(tempAssemblyFileName);

            var mutator = new DummyTurtle();
            IEnumerable<MutantMetaData> mutations = mutator
                .Mutate(addMethod, module, addMethod.Body.Instructions.Select(i => i.Offset).ToArray());

            var directories = new List<string>();

            foreach (var mutation in mutations)
            {
                string directoryName = mutation.TestDirectoryName;
                directories.Add(directoryName);
                Assert.IsTrue(Directory.Exists(directoryName));
                mutator.MutantComplete(mutation);
            }

            foreach (var directory in directories)
            {
                Assert.IsFalse(Directory.Exists(directory));
            }
        }
        public void Mutate_Multiple_Delegates_Identifies_All_Delegate_Methods()
        {
            var module = new Module(typeof(ClosureClassUnderTest).Assembly.Location);
            module.LoadDebugInformation();

            var turtle = new DummyTurtle();
            var method = module.Definition.Types
                .Single(t => t.Name == "ClosureClassUnderTest")
                .Methods.Single(m => m.Name == "AddMultipleDelegates");

            //act
            var mutations = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).ToList();

            //assert
            Assert.AreEqual(3, mutations.Count, "mutations.Count");
            var delegateMethod = mutations[2].MethodDefinition;
            Assert.IsTrue(delegateMethod.Name.StartsWith("<AddMultipleDelegates>"));
            Assert.AreEqual(2, delegateMethod.Parameters.Count, "third mutated method should be second delegate");
        }
        public void Mutate_Delegate_Resolves_And_Numbers_Source_Code()
        {
            var module = new Module(typeof(ClosureClassUnderTest).Assembly.Location);
            module.LoadDebugInformation();

            var turtle = new DummyTurtle();
            var method = module.Definition.Types
                .Single(t => t.Name == "ClosureClassUnderTest")
                .Methods.Single(m => m.Name == "ReturnsDelegate");

            var enumerator = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).GetEnumerator();
            Assert.IsTrue(enumerator.MoveNext());
            Assert.IsTrue(enumerator.MoveNext());

            Assert.AreEqual(@"  35:         public Func<int, int, int> ReturnsDelegate()
  36:         {
  37:             return (l, r) => l + r;
  38:         }
  39: ".Replace("\r\n", "\n").Replace("\n", Environment.NewLine), enumerator.Current.GetOriginalSourceCode(enumerator.Current.ILIndex));
        }
        public void Mutate_Closure_Identifies_Closure_Method()
        {
            var module = new Module(typeof(ClosureClassUnderTest).Assembly.Location);
            module.LoadDebugInformation();

            var turtle = new DummyTurtle();
            var method = module.Definition.Types
                .Single(t => t.Name == "ClosureClassUnderTest")
                .Methods.Single(m => m.Name == "AddClosure");

            //act
            var mutations = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).ToList();

            //assert
            Assert.AreEqual(2, mutations.Count, "mutations.Count");
            var closureMethod = mutations[1].MethodDefinition;
            Assert.IsTrue(closureMethod.Name.StartsWith("<AddClosure>"));
        }
        public void Mutate_Resolves_And_Numbers_Source_Code()
        {
            var module = new Module(typeof(AdditionClassUnderTest).Assembly.Location);
            module.LoadDebugInformation();
            
            var turtle = new DummyTurtle();
            var method = module.Definition.Types
                .Single(t => t.Name == "AdditionClassUnderTest")
                .Methods.Single(m => m.Name == "Add");

                //act
            var mutation = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).First();
            
                //assert
                Assert.AreEqual(@"  30: 
  31:         public int Add(int left, int right)
  32:         {
  33:             return left + right;
  34:         }".Replace("\r\n", "\n").Replace("\n", Environment.NewLine), mutation.GetOriginalSourceCode(mutation.ILIndex));
            
        }
Пример #10
0
        public void DoYield_Saves_Assembly()
        {
            var assembly = CreateTestAssembly();
            var turtle = new DummyTurtle();
            var method = assembly.MainModule.Types
                .Single(t => t.Name == "TestClass")
                .Methods.Single(m => m.Name == "TestMethod");

            string tempAssemblyFileName = GetTempAssemblyFileName();
            assembly.Write(tempAssemblyFileName);
            var originalFile = File.ReadAllBytes(tempAssemblyFileName);
            Thread.Sleep(1);
            var module = new Module(tempAssemblyFileName);
            method = module.Definition
                .Types.First(t => t.Name == "TestClass")
                .Methods.First(m => m.Name == "TestMethod");

            var mutation = turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()).First();
            string mutatedAssemblyFileName = Path.Combine(mutation.TestDirectory.FullName,
                                                          Path.GetFileName(tempAssemblyFileName));
            var newFile = File.ReadAllBytes(mutatedAssemblyFileName);
            Assert.IsFalse(Enumerable.SequenceEqual(originalFile, newFile));
        }
Пример #11
0
        public void Mutate_Simplifies_Macros_In_Nested_Classes()
        {
            var module = new Module(typeof(ConditionalBoundaryTurtle).Assembly.Location);
            module.LoadDebugInformation();

            var method = module.Definition
                .Types.Single(t => t.Name == "ConditionalBoundaryTurtle")
                .Methods.Single(t => t.Name == "CreateMutant");

            var nestedMethod = method.DeclaringType
                .NestedTypes.Single(t => t.Name.StartsWith("<CreateMutant>"))
                .Methods.Single(t => t.Name == "MoveNext");

            var turtle = new DummyTurtle();
            bool expanded = false;
            foreach (var mutantMetaData in turtle.Mutate(method, module, method.Body.Instructions.Select(i => i.Offset).ToArray()))
            {
                if (mutantMetaData.MethodDefinition.Name == "MoveNext")
                {
                    Assert.AreEqual(OpCodes.Ldarg, nestedMethod.Body.Instructions.First().OpCode);
                    expanded = true;
                }
            }

            Assert.IsTrue(expanded);
            Assert.AreEqual(OpCodes.Ldarg_0, nestedMethod.Body.Instructions.First().OpCode);
        }