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 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 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);
        }
        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
        }