public void HasBaseMethod()
        {
            Assert.That(_context.HasBaseMethod, Is.True);

            var context = MethodBodyContextBaseObjectMother.Create(baseMethod: null);

            Assert.That(context.HasBaseMethod, Is.False);
        }
        public void BaseMethod()
        {
            Assert.That(_context.BaseMethod, Is.SameAs(_baseMethod));

            var context = MethodBodyContextBaseObjectMother.Create(baseMethod: null);

            Assert.That(
                () => context.BaseMethod, Throws.TypeOf <NotSupportedException>().With.Message.EqualTo("This method does not override another method."));
        }
        public void DelegateTo_Static_WithGenericParameters()
        {
            var context = MethodBodyContextBaseObjectMother.Create(genericParameters: _genericParameters);
            var method  = NormalizingMemberInfoFromExpressionUtility.GetGenericMethodDefinition(() => Enumerable.Empty <Dev.T>());

            var result = context.DelegateTo(null, method);

            Assert.That(result.Object, Is.Null);
            Assert.That(result.Method, Is.SameAs(method.MakeTypePipeGenericMethod(_genericParameters)));
        }
        public void DelegateTo_Instance_WithParameters()
        {
            var context  = MethodBodyContextBaseObjectMother.Create(parameterExpressions: _parameters);
            var instance = Expression.Default(typeof(object));
            var method   = NormalizingMemberInfoFromExpressionUtility.GetMethod((object o) => o.Equals(null));

            var result = context.DelegateTo(instance, method);

            Assert.That(result.Object, Is.SameAs(instance));
            Assert.That(result.Method, Is.SameAs(method));
            Assert.That(result.Arguments, Is.EqualTo(_parameters));
        }
        public void DelegateToBase()
        {
            var declaringType = MutableTypeObjectMother.Create(typeof(BaseType));
            var baseMethod    = NormalizingMemberInfoFromExpressionUtility.GetGenericMethodDefinition((BaseType o) => o.BaseMethod <Dev.T> (null));
            var parameters    = new[] { Expression.Parameter(_genericParameters[0]) };
            var context       = MethodBodyContextBaseObjectMother.Create(
                declaringType, genericParameters: _genericParameters, parameterExpressions: parameters, baseMethod: baseMethod);

            var result = context.DelegateToBase(baseMethod);

            var expected = Expression.Call(
                new ThisExpression(declaringType),
                new NonVirtualCallMethodInfoAdapter(baseMethod.MakeTypePipeGenericMethod(_genericParameters)),
                parameters.Cast <Expression>());

            ExpressionTreeComparer.CheckAreEqualTrees(expected, result);
        }