public void DoMutate_Returns_Correct_Replacements_For_Addition()
        {
            var assembly = CreateTestAssembly(OpCodes.Add);

            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 ArithmeticOperatorTurtle();
            IEnumerable <MutantMetaData> mutations = mutator
                                                     .Mutate(addMethod, module, addMethod.Body.Instructions.Select(i => i.Offset).ToArray());

            int sub   = 0;
            int mul   = 0;
            int div   = 0;
            int rem   = 0;
            int total = 0;

            foreach (var metaData in mutations)
            {
                total++;
                if (metaData.MethodDefinition.Body.Instructions.Any(i => i.OpCode == OpCodes.Sub))
                {
                    sub++;
                }
                if (metaData.MethodDefinition.Body.Instructions.Any(i => i.OpCode == OpCodes.Mul))
                {
                    mul++;
                }
                if (metaData.MethodDefinition.Body.Instructions.Any(i => i.OpCode == OpCodes.Div))
                {
                    div++;
                }
                if (metaData.MethodDefinition.Body.Instructions.Any(i => i.OpCode == OpCodes.Rem))
                {
                    rem++;
                }
            }

            Assert.AreEqual(4, total);
            Assert.AreEqual(1, sub);
            Assert.AreEqual(1, mul);
            Assert.AreEqual(1, div);
            Assert.AreEqual(1, rem);
        }
        public void DoMutate_Returns_Correct_Replacements_For_Division_And_Describes_Appropriately()
        {
            var assembly = CreateTestAssembly(OpCodes.Div);

            var divideMethod = 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 ArithmeticOperatorTurtle();
            IEnumerable <MutantMetaData> mutations = mutator
                                                     .Mutate(divideMethod, module, divideMethod.Body.Instructions.Select(i => i.Offset).ToArray());

            int add   = 0;
            int sub   = 0;
            int mul   = 0;
            int rem   = 0;
            int total = 0;

            foreach (var metaData in mutations)
            {
                total++;
                add += MatchReplacement(metaData, OpCodes.Div, OpCodes.Add);
                sub += MatchReplacement(metaData, OpCodes.Div, OpCodes.Sub);
                mul += MatchReplacement(metaData, OpCodes.Div, OpCodes.Mul);
                rem += MatchReplacement(metaData, OpCodes.Div, OpCodes.Rem);
            }

            Assert.AreEqual(4, total);
            Assert.AreEqual(1, add);
            Assert.AreEqual(1, sub);
            Assert.AreEqual(1, mul);
            Assert.AreEqual(1, rem);
        }