public void Visit_NoOperand_EmitsInstruction()
        {
            _generatorMock
            .Setup(generator => generator.Emit(System.Reflection.Emit.OpCodes.Nop))
            .Verifiable();
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            subject.Visit(Instruction.Create(OpCodes.Nop));

            _generatorMock.Verify();
        }
        public void VisitInlineInteger_IntOperand_EmitsInstruction(long value)
        {
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            _generatorMock
            .Setup(generator => generator.Emit(System.Reflection.Emit.OpCodes.Ldc_I8, value))
            .Verifiable();

            var instruction = Instruction.Create(OpCodes.Ldc_I8, value);

            subject.VisitInlineInteger(instruction, value);

            _generatorMock.Verify();
        }
        public void VisitInlineArg_UShortArgument_EmitsInstruction()
        {
            ParameterDefinition parameter = TestDataFactory.CreateParameterDefinition(256);

            _generatorMock
            .Setup(generator => generator.Emit(System.Reflection.Emit.OpCodes.Ldarg, parameter.Index))
            .Verifiable();
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            var instruction = Instruction.Create(OpCodes.Ldarg, parameter);

            subject.VisitInlineArg(instruction, parameter);

            _generatorMock.Verify();
        }
        public void VisitInlineBrTarget_EmitsInstruction()
        {
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            _generatorMock
            .Setup(generator => generator.Emit(System.Reflection.Emit.OpCodes.Br, It.IsAny <Label>()))
            .Verifiable();

            var target      = Instruction.Create(OpCodes.Nop);
            var instruction = Instruction.Create(OpCodes.Br, target);

            subject.VisitInlineBrTarget(instruction, target);

            _generatorMock.Verify();
        }
        public void VisitInlineArg_ByteArgument_EmitsInstruction()
        {
            var method = CecilUtility.Import(ReflectionUtility.GetMethod(() => int.Parse(string.Empty))).Resolve();

            ParameterDefinition parameter = method.Parameters[0];

            _generatorMock
            .Setup(generator => generator.Emit(System.Reflection.Emit.OpCodes.Ldarg_S, (byte)parameter.Index))
            .Verifiable();
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            var instruction = Instruction.Create(OpCodes.Ldarg_S, parameter);

            subject.VisitInlineArg(instruction, parameter);

            _generatorMock.Verify();
        }
        public void VisitInlineSwitch_EmitsInstruction()
        {
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            _generatorMock
            .Setup(generator => generator.Emit(
                       System.Reflection.Emit.OpCodes.Switch,
                       It.Is <Label[]>(labels => labels.Length == 2)))
            .Verifiable();

            var targets     = new[] { Instruction.Create(OpCodes.Nop), Instruction.Create(OpCodes.Nop) };
            var instruction = Instruction.Create(OpCodes.Switch, targets);

            subject.VisitInlineSwitch(instruction, targets);

            _generatorMock.Verify();
        }
        public void VisitInlineMethod_ConstructorOperand_EmitsInstruction()
        {
            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            _generatorMock
            .Setup(generator => generator.Emit(
                       System.Reflection.Emit.OpCodes.Newobj,
                       It.Is <ConstructorInfo>(constructor => constructor.DeclaringType.Name == "MemoryStream")))
            .Verifiable();

            var method      = ReflectionUtility.GetMethod(() => new MemoryStream());
            var instruction = Instruction.Create(OpCodes.Newobj, CecilUtility.Import(method));

            subject.VisitInlineMethod(instruction, (MethodReference)instruction.Operand);

            _generatorMock.Verify();
        }
        public void VisitInlineField_EmitsInstruction()
        {
            TypeDefinition  type            = CecilUtility.Import(GetType()).Resolve();
            FieldDefinition fieldDefinition = type.Fields.First(f => f.Name == "TestField");

            var subject = new ILGeneratorInstructionVisitor(_generatorMock.Object);

            _generatorMock
            .Setup(generator => generator.Emit(
                       System.Reflection.Emit.OpCodes.Ldfld,
                       It.Is <FieldInfo>(field => field.Name == fieldDefinition.Name)))
            .Verifiable();

            var instruction = Instruction.Create(OpCodes.Ldfld, fieldDefinition);

            subject.VisitInlineField(instruction, fieldDefinition);

            _generatorMock.Verify();
        }