public void ShimmedMethod_Generates_From_Static_Call_With_Params_And_Returns_Reference_Type()
        {
            var shimmedMethod = new ShimmedMethod <List <int> >(typeof(StaticMethodsTestClass).GetMethod("MethodWithParamsAndReferenceTypeReturn"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var        beforeDateTime = DateTime.Now;
            List <int> value          = null;

            PoseContext.Isolate(() => {
                value = StaticMethodsTestClass.MethodWithParamsAndReferenceTypeReturn(2, 4);
            }, new[] { shimmedMethod.Shim });
            Assert.IsNotNull(value);
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);
            Assert.AreEqual(2, (int)callResult.Parameters[0]);
            Assert.AreEqual(4, (int)callResult.Parameters[1]);
        }
        public void ShimmedMethod_Generates_From_Empty_Static_Method_Call()
        {
            var shimmedMethod = new ShimmedMethod(typeof(StaticMethodsTestClass).GetMethod("EmptyMethod"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            try
            {
                var beforeDateTime = DateTime.Now;
                PoseContext.Isolate(() => {
                    StaticMethodsTestClass.EmptyMethod();
                }, new[] { shimmedMethod.Shim });
                Assert.AreEqual(1, shimmedMethod.CallResults.Count);
                var callResult = shimmedMethod.CallResults.First();
                Assert.IsNotNull(callResult.Parameters);
                var afterDateTime = DateTime.Now;
                Assert.IsNotNull(callResult.CalledAt);
                Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);
            }
            catch (Exception e)
            {
                Assert.Fail(e.Message);
            }
        }
        public void ShimmedMethod_Generates_From_Static_Call_With_Multi_Params_And_Returns_Value()
        {
            var shimmedMethod = new ShimmedMethod <int>(typeof(StaticMethodsTestClass).GetMethod("MethodWithParamsAndReturn"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;
            int value          = -1;

            PoseContext.Isolate(() => {
                value = StaticMethodsTestClass.MethodWithParamsAndReturn(2, 4);
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(0, value); // Shimmy will set to default for that value type
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);
            Assert.AreEqual(2, (int)callResult.Parameters[0]);
            Assert.AreEqual(4, (int)callResult.Parameters[1]);
        }
        public void ShimmedMethod_Generates_From_Static_Call_Records_Multi_Parameters()
        {
            var shimmedMethod = new ShimmedMethod(typeof(StaticMethodsTestClass).GetMethod("MethodWithMultiParams"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;

            PoseContext.Isolate(() => {
                StaticMethodsTestClass.MethodWithMultiParams(5, 6, "bird", new List <bool> {
                    true, false, true
                });
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);

            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);

            Assert.AreEqual(5, (int)callResult.Parameters[0]);
            Assert.AreEqual(6, (int)callResult.Parameters[1]);
            Assert.AreEqual("bird", (string)callResult.Parameters[2]);
            Assert.IsTrue(new List <bool> {
                true, false, true
            }.SequenceEqual((List <bool>)callResult.Parameters[3]));
        }
        public void ShimmedMethod_Generates_From_Instance_Call_And_Returns_Value()
        {
            var a             = new InstanceMethodsTestClass();
            var shimmedMethod = new ShimmedMethod <int>(typeof(InstanceMethodsTestClass).GetMethod("MethodWithReturn"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;
            int value          = -1;

            PoseContext.Isolate(() => {
                value = a.MethodWithReturn();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(0, value); // Shimmy will set to default for that value type
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);

            // first parameter should be instance
            var instanceParam = callResult.Parameters[0] as InstanceMethodsTestClass;

            Assert.IsNotNull(instanceParam);
            Assert.AreEqual(a.InstanceGuid, instanceParam.InstanceGuid);
        }
        public void ShimmedMethod_Generates_From_Empty_Instance_Virtual_Method_Call()
        {
            var a             = new InstanceMethodsTestClass();
            var shimmedMethod = new ShimmedMethod(typeof(InstanceMethodsTestClass).GetMethod("EmptyVirtualMethod"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;

            PoseContext.Isolate(() => {
                a.EmptyVirtualMethod();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);

            // first parameter should be instance
            var instanceParam = callResult.Parameters[0] as InstanceMethodsTestClass;

            Assert.IsNotNull(instanceParam);
            Assert.AreEqual(a.InstanceGuid, instanceParam.InstanceGuid);
        }
        public void ShimmedMethod_Generates_From_Static_Call_With_Multi_Params_And_Returns_Reference_Type()
        {
            var shimmedMethod = new ShimmedMethod <List <int> >(typeof(StaticMethodsTestClass).GetMethod("MethodWithMultiReferenceTypeParamsAndReturn"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var        beforeDateTime = DateTime.Now;
            List <int> value          = null;

            PoseContext.Isolate(() => {
                value = StaticMethodsTestClass.MethodWithMultiReferenceTypeParamsAndReturn(new List <int> {
                    3, 2, 1
                }, "bird", DateTime.Today);
            }, new[] { shimmedMethod.Shim });
            Assert.IsNotNull(value);
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);
            Assert.IsTrue(((List <int>)callResult.Parameters[0]).SequenceEqual(new List <int> {
                3, 2, 1
            }));
            Assert.AreEqual("bird", (string)callResult.Parameters[1]);
            Assert.AreEqual(DateTime.Today, (DateTime)callResult.Parameters[2]);
        }
        public void ShimmedMethod_Generates_From_Static_Call_Records_String_Parameters()
        {
            var shimmedMethod = new ShimmedMethod(typeof(StaticMethodsTestClass).GetMethod("MethodWithStringParam"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;

            PoseContext.Isolate(() => {
                StaticMethodsTestClass.MethodWithStringParam("bird");
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);

            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);

            var expectedParam = callResult.Parameters[0];

            Assert.AreEqual("bird", (string)expectedParam);
        }
        public void ShimmedMethod_Call_Returns_Custom_Return_Value_For_Instance_Method_Value_Type()
        {
            var a             = new TestClass();
            var shimmedMethod = new ShimmedMethod <int>(typeof(TestClass).GetMethod("MethodWithValueReturnType"), 5);

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;
            var value          = 0;

            PoseContext.Isolate(() => {
                value = a.MethodWithValueReturnType();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);
            Assert.AreEqual(5, value);
        }
        public void ShimmedMethod_Call_Returns_New_Return_Value_When_Return_Value_Changed()
        {
            var a             = new TestClass();
            var shimmedMethod = new ShimmedMethod <int>(typeof(TestClass).GetMethod("MethodWithValueReturnType"), 5);
            var value         = 0;

            PoseContext.Isolate(() => {
                value = a.MethodWithValueReturnType();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(5, value);

            shimmedMethod.ReturnValue = 6;
            var value2 = 0;

            PoseContext.Isolate(() => {
                value2 = a.MethodWithValueReturnType();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(6, value2);

            shimmedMethod.ReturnValue = 7;
            var value3 = 0;

            PoseContext.Isolate(() => {
                value3 = a.MethodWithValueReturnType();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(7, value3);
        }
        public void ShimmedMethod_Generates_From_Instance_Call_Records_String_Parameters()
        {
            var a             = new InstanceMethodsTestClass();
            var shimmedMethod = new ShimmedMethod(typeof(InstanceMethodsTestClass).GetMethod("MethodWithStringParam"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;

            PoseContext.Isolate(() => {
                a.MethodWithStringParam("bird");
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);

            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);

            // first parameter should be instance
            var instanceParam = callResult.Parameters[0] as InstanceMethodsTestClass;

            Assert.IsNotNull(instanceParam);
            Assert.AreEqual(a.InstanceGuid, instanceParam.InstanceGuid);

            var expectedParam = callResult.Parameters[1];

            Assert.AreEqual("bird", (string)expectedParam);
        }
        public void ShimmedMethod_Call_Returns_Custom_Return_Value_For_Static_Method_Reference_Type()
        {
            var shimmedMethod = new ShimmedMethod <List <int> >(typeof(TestClass).GetMethod("StaticMethodWithReferenceReturnType"), new List <int> {
                1, 2, 3
            });

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var beforeDateTime = DateTime.Now;
            var value          = new List <int>();

            PoseContext.Isolate(() => {
                value = TestClass.StaticMethodWithReferenceReturnType();
            }, new[] { shimmedMethod.Shim });
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);
            Assert.IsTrue(value.SequenceEqual(new List <int> {
                1, 2, 3
            }));
        }
        public void ShimmedMethod_SetReturnValue_Excepts_When_Called_On_ShimmedMethod_With_Void_Return_Type()
        {
            var shimmedMethod = new ShimmedMethod(typeof(TestClass).GetMethod("VoidMethod"));

            try
            {
                shimmedMethod.ReturnValue = 5;
            }
            catch (InvalidOperationException e)
            {
                Assert.AreEqual(ShimReplacement.CannotSetReturnTypeOnVoidMemberError, e.Message);
            }
        }
        public void ShimmedMethod_SetReturnValue_Excepts_When_Called_On_ShimmedMethod_With_Wrong_Param_Type()
        {
            var shimmedMethod = new ShimmedMethod <int>(typeof(TestClass).GetMethod("StaticMethodWithValueReturnType"));

            try
            {
                shimmedMethod.ReturnValue = "bird";
            }
            catch (InvalidOperationException e)
            {
                var expectedString = string.Format(ShimReplacement.InvalidReturnTypeError, typeof(string), typeof(int));
                Assert.AreEqual(expectedString, e.Message);
            }
        }
        public void ShimmedMethod_Generates_From_Instance_Call_With_Reference_Type_Param_And_Returns_Reference_Type()
        {
            var a             = new InstanceMethodsTestClass();
            var shimmedMethod = new ShimmedMethod <List <int> >(typeof(InstanceMethodsTestClass).GetMethod("MethodWithReferenceTypeParamsAndReturn"));

            Assert.IsNotNull(shimmedMethod);
            Assert.IsNotNull(shimmedMethod.Method);
            Assert.IsNotNull(shimmedMethod.Shim);

            var        beforeDateTime = DateTime.Now;
            List <int> value          = null;

            PoseContext.Isolate(() => {
                value = a.MethodWithReferenceTypeParamsAndReturn(new List <int> {
                    3, 2, 1
                });
            }, new[] { shimmedMethod.Shim });
            Assert.IsNotNull(value);
            Assert.AreEqual(1, shimmedMethod.CallResults.Count);
            var callResult = shimmedMethod.CallResults.First();

            Assert.IsNotNull(callResult.Parameters);
            var afterDateTime = DateTime.Now;

            Assert.IsNotNull(callResult.CalledAt);
            Assert.IsTrue(beforeDateTime < callResult.CalledAt && callResult.CalledAt < afterDateTime);

            // first parameter should be instance
            var instanceParam = callResult.Parameters[0] as InstanceMethodsTestClass;

            Assert.IsNotNull(instanceParam);
            Assert.AreEqual(a.InstanceGuid, instanceParam.InstanceGuid);

            Assert.IsTrue(((List <int>)callResult.Parameters[1]).SequenceEqual(new List <int> {
                3, 2, 1
            }));
        }
        public void ShimmedMethod_Uses_Empty_Object_For_Reference_Types_With_Parameterless_Constructor_When_No_Return_Value_Specified()
        {
            var shimmedMethod = new ShimmedMethod <TestClass>(typeof(TestClass).GetMethod("GetTestClass"));

            Assert.IsNotNull(shimmedMethod.ReturnValue);
        }
        public void ShimmedMethod_Uses_Default_For_Reference_Types_With_No_Parameterless_Constructor_When_No_Return_Value_Specified()
        {
            var shimmedMethod = new ShimmedMethod <TestClassNoParameterlessConstructor>(typeof(TestClass).GetMethod("GetTestClassNoParameterlessConstructor"));

            Assert.AreEqual(default(TestClassNoParameterlessConstructor), shimmedMethod.ReturnValue);
        }
        public void ShimmedMethod_Uses_Default_Return_Type_For_Value_Types_When_No_Return_Value_Specified()
        {
            var shimmedMethod = new ShimmedMethod <int>(typeof(TestClass).GetMethod("StaticMethodWithValueReturnType"));

            Assert.AreEqual(default(int), shimmedMethod.ReturnValue);
        }