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_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)); }
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); }