public void CannotResolveArg()
        {
            var method      = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });
            var messageMock = new Mock <IMessage>();

            _message = messageMock.Object;

            _resolvers = new HandlerMethodArgumentResolverComposite();
            var ex = Assert.Throws <MethodArgumentResolutionException>(() => Invoke(new Handler(), method));

            Assert.Contains("Could not resolve parameter [0]", ex.Message);
        }
        public void HandleSinglePrimitiveReturnVoidPerf()
        {
            var handler     = new Handler2();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var method = typeof(Handler2).GetMethod("HandleSinglePrimitiveReturnVoid");

            Invoke(handler, method, 1.0d);
            Assert.Equal(1.0d, handler.DoubleValue);
        }
        public void HandleNullablePrimitive()
        {
            var handler     = new Handler2();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var method = typeof(Handler2).GetMethod("HandleNullablePrimitive");
            var result = Invoke(handler, method, 10, "stringArg");

            Assert.Equal(1, handler.InvocationCount);
            Assert.Equal("10-stringArg", result);
        }
        public void ExceptionInResolvingArg()
        {
            var method      = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();

            _resolvers.AddResolver(new ExceptionRaisingArgumentResolver());
            Assert.Throws <ArgumentException>(() => Invoke(new Handler(), method));

            // expected -  allow HandlerMethodArgumentResolver exceptions to propagate
        }
        public void ResolveProvidedArgFirst()
        {
            var method      = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();

            _resolvers.AddResolver(new StubArgumentResolver(1));
            _resolvers.AddResolver(new StubArgumentResolver("value1"));
            var value = Invoke(new Handler(), method, 2, "value2");

            Assert.Equal("2-value2", value);
        }
        public void ResolveProvidedArg()
        {
            var method      = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();

            var value = Invoke(new Handler(), method, 99, "value");

            Assert.NotNull(value);
            Assert.IsType <string>(value);
            Assert.Equal("99-value", value);
        }
        public async Task HandleAsyncStringMethod()
        {
            var handler     = new Handler2();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var method = typeof(Handler2).GetMethod("HandleAsyncStringMethod");
            var result = Invoke(handler, method, 10, "stringArg") as Task <string>;
            var str    = await result;

            Assert.Equal(1, handler.InvocationCount);
            Assert.Equal("10-stringArg", str);
        }
        public async Task HandleAsyncVoidMethod()
        {
            var handler     = new Handler2();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var   method = typeof(Handler2).GetMethod("HandleAsyncVoidMethod");
            var   result = Invoke(handler, method, 1.0d) as Task;
            await result;

            Assert.Equal(1, handler.InvocationCount);
            Assert.Equal(1.0d, handler.DoubleValue);
        }
        public void HandleMultiReturnVoid()
        {
            var handler     = new Handler2();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var method = typeof(Handler2).GetMethod("HandleMultiReturnVoid");

            Invoke(handler, method, 1.0d, 2, handler);
            Assert.Equal(1.0d, handler.DoubleValue);
            Assert.Equal(2, handler.IntValue);
            Assert.Same(handler, handler.ObjectValue);
        }
        public void ComparePerfHandleSinglePrimitiveReturnVoid()
        {
            var handler     = new Handler2();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var method = typeof(Handler2).GetMethod("HandleSinglePrimitiveReturnVoid");
            var ticks1 = TimedInvoke(handler, method, 100_000, 1.0d);

            Assert.Equal(100_000, handler.InvocationCount);
            var ticks2 = TimedReflectionInvoke(handler, method, 100_000, 1.0d);

            Assert.Equal(200_000, handler.InvocationCount);
            Assert.True(ticks2 > ticks1);
        }
        public void ResolveNoArgValue()
        {
            var messageMock = new Mock <IMessage>();

            _message = messageMock.Object;

            _resolvers = new HandlerMethodArgumentResolverComposite();
            _resolvers.AddResolver(new StubArgumentResolver(typeof(int?)));
            _resolvers.AddResolver(new StubArgumentResolver(typeof(string)));
            var method = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });

            var value = Invoke(new Handler(), method);

            Assert.Single(GetStubResolver(0).ResolvedParameters);
            Assert.Single(GetStubResolver(1).ResolvedParameters);
            Assert.Equal("null-null", value);
        }
        public void ResolveArg()
        {
            var messageMock = new Mock <IMessage>();

            _message = messageMock.Object;

            _resolvers = new HandlerMethodArgumentResolverComposite();
            _resolvers.AddResolver(new StubArgumentResolver(99));
            _resolvers.AddResolver(new StubArgumentResolver("value"));
            var method = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });
            var value  = Invoke(new Handler(), method);

            Assert.Single(GetStubResolver(0).ResolvedParameters);
            Assert.Single(GetStubResolver(1).ResolvedParameters);
            Assert.Equal("99-value", value);
            Assert.Equal("intArg", GetStubResolver(0).ResolvedParameters[0].Name);
            Assert.Equal("stringArg", GetStubResolver(1).ResolvedParameters[0].Name);
        }
        public void InvocationTargetException()
        {
            var handler     = new Handler();
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();
            var method = typeof(Handler).GetMethod("HandleWithException");

            var runtimeException = new Exception("error");
            var ex = Assert.Throws <Exception>(() => Invoke(handler, method, runtimeException));

            Assert.Same(runtimeException, ex);

            var error = new IndexOutOfRangeException("error");
            var ex2   = Assert.Throws <IndexOutOfRangeException>(() => Invoke(handler, method, error));

            Assert.Same(error, ex2);
        }
        public void IllegalArgumentException()
        {
            var method      = typeof(Handler).GetMethod("Handle", new Type[] { typeof(int?), typeof(string) });
            var messageMock = new Mock <IMessage>();

            _message   = messageMock.Object;
            _resolvers = new HandlerMethodArgumentResolverComposite();

            _resolvers.AddResolver(new StubArgumentResolver(typeof(int?), "__not_an_int__"));
            _resolvers.AddResolver(new StubArgumentResolver("value"));
            var ex = Assert.Throws <InvalidOperationException>(() => Invoke(new Handler(), method));

            Assert.IsType <ArgumentException>(ex.InnerException);
            Assert.Contains("Endpoint [", ex.Message);
            Assert.Contains("Method [", ex.Message);
            Assert.Contains("with argument values:", ex.Message);
            Assert.Contains("[0] [type=System.String] [value=__not_an_int__]", ex.Message);
            Assert.Contains("[1] [type=System.String] [value=value", ex.Message);
        }