예제 #1
0
        public async Task AsyncMethodExceptionPassedAlong()
        {
            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>()
            {
                { 1, ObjectDescriptor.Create().WithMethods(new List <MethodDescriptor>()
                    {
                        MethodDescriptor.Create()
                        .WithId(2)
                        .WithParameterCount(1)
                        .WithParameters(new List <MethodParameterDescriptor>
                        {
                            new MethodParameterDescriptor(typeof(string), false)
                        })
                        .WithExecute((o, a) => Task.FromException(new NotSupportedException("Error")))
                        .Get()
                    }).WithId(1).Get() }
            }), context => { });

            const string Value  = "expected";
            var          result = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ObjectId   = 1,
                MethodId   = 2,
                Parameters = new object[] { Value }
            });

            Assert.Equal("Error", result.Error);
            Assert.False(result.Success);
        }
예제 #2
0
        public async Task MethodParameterTypeMismatchThrows()
        {
            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>()
            {
                { 1, ObjectDescriptor.Create().WithMethods(new List <MethodDescriptor>()
                    {
                        MethodDescriptor.Create().WithId(2).WithParameterCount(1).WithParameters(new List <MethodParameterDescriptor>
                        {
                            new MethodParameterDescriptor(typeof(string), false)
                        }).Get()
                    }).WithId(1).Get() }
            }), context => { context.ObjectValue = context.NativeValue; });

            var result = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ObjectId   = 1,
                MethodId   = 2,
                Parameters = new object[] { 1 }
            });

            Assert.Equal("Parameter mismatch.", result.Error);
            Assert.False(result.Success);
        }
예제 #3
0
        public async Task MethodCallExceptionPassedAlong()
        {
            var method = typeof(SimpleClassWithExceptions).GetMethod("ThrowException");

            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>
            {
                { 1, ObjectDescriptor.Create()
                  .WithObject(new SimpleClassWithExceptions())
                  .WithMethods(new List <MethodDescriptor>
                    {
                        MethodDescriptor.Create()
                        .WithId(2)
                        .WithParameterCount(0)
                        .WithParameters(new List <MethodParameterDescriptor>
                        {
                        })
                        .WithExecute((o, a) => method.Invoke(o, a))
                        .Get()
                    }).WithId(1).Get() }
            }), context => { });

            var result = await methodExecutor.Execute(new MethodExecution <object>
            {
                ObjectId   = 1,
                MethodId   = 2,
                Parameters = new object[] { }
            });

            Assert.Equal("Error", result.Error);
            Assert.False(result.Success);
        }
예제 #4
0
        private void ExecuteConfigure()
        {
            var configureMethod = GetType().GetMethod("Configure", BindingFlags.NonPublic | BindingFlags.Instance);

            if (configureMethod != null)
            {
                MethodExecutor.Execute(DiContainer, this, configureMethod);
            }
        }
예제 #5
0
        public async Task NonExistentObjectError()
        {
            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(new Dictionary <long, ObjectDescriptor>()),
                context => { });
            var result = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ObjectId = 1
            });

            Assert.Equal("Invalid object.", result.Error);
            Assert.False(result.Success);
        }
예제 #6
0
        public void Execute_CallMethodWithoutResult_AllParametersResolved()
        {
            var testService    = new TestService();
            var unknownService = new UnknownService();
            var testServiceInt = new TestService <int>();

            var container = CreateContainerMock(testService, unknownService, testServiceInt);

            var instance = new TestClassForExecutor();

            MethodExecutor.Execute(container, instance, instance.GetType().GetMethod(nameof(TestClassForExecutor.DoSomething)));

            Assert.Same(testService, instance.TestService);
            Assert.Same(unknownService, instance.UnknownService);
            Assert.Same(testServiceInt, instance.TestServiceInt);
        }
예제 #7
0
        public void MethodExecutorTest_ExecuteMethodWithParameter()
        {
            //Arrange
            var methodInfo     = typeof(SimplePOCOBatch).GetMethod("method3");
            var targetTypeInfo = typeof(SimplePOCOBatch).GetTypeInfo();
            var instance       = new SimplePOCOBatch();

            MethodExecutor methodExecutor = MethodExecutor.Create(methodInfo, targetTypeInfo);

            //Act
            var response = methodExecutor.Execute(instance, new[] { "method3" });

            //Assert
            Assert.NotNull(response);
            Assert.IsType <string>(response);
            Assert.Equal("method3", response);
        }
예제 #8
0
        public async Task MethodCalled()
        {
            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>()
            {
                {
                    1, ObjectDescriptor.Create().WithMethods(new List <MethodDescriptor>()
                    {
                        MethodDescriptor.Create()
                        .WithId(2)
                        .WithParameterCount(1)
                        .WithParameters(new List <MethodParameterDescriptor>
                        {
                            new MethodParameterDescriptor(typeof(string), false)
                        })
                        .WithExecute((o, a) => a[0] as string)
                        .Get()
                    }).WithId(1).Get()
                }
            }), context =>
            {
                if (context.Direction == ObjectBindingDirection.In)
                {
                    context.ObjectValue = context.NativeValue;
                }
                else
                {
                    context.NativeValue = context.ObjectValue;
                }
            });

            const string Value       = "expected";
            const int    ExecutionId = 3;
            var          result      = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ExecutionId = ExecutionId,
                ObjectId    = 1,
                MethodId    = 2,
                Parameters  = new object[] { Value }
            });

            Assert.Equal(Value, result.Result as string);
            Assert.Equal(ExecutionId, result.ExecutionId);
            Assert.True(result.Success);
        }
예제 #9
0
        public async Task NonExistentMethodError()
        {
            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>()
            {
                { 1, ObjectDescriptor.Create().WithMethods(new List <MethodDescriptor>()).WithId(1).Get() }
            }), context => { });
            var result = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ObjectId = 1,
                MethodId = 2
            });


            Assert.Equal("Invalid function.", result.Error);
            Assert.False(result.Success);
        }
예제 #10
0
        public async Task ReturnValueBindingSetIfNecessary()
        {
            const string Value          = "expected";
            var          methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>
            {
                {
                    1, ObjectDescriptor.Create().WithMethods(new List <MethodDescriptor>
                    {
                        MethodDescriptor.Create()
                        .WithId(2)
                        .WithParameterCount(1)
                        .WithBindValue(new BindValueAttribute())
                        .WithResultType(typeof(string))
                        .WithParameters(new List <MethodParameterDescriptor>
                        {
                        })
                        .WithExecute((o, a) => Value)
                        .Get()
                    }).WithId(1).Get()
                }
            }), context =>
            {
                if (context.Direction == ObjectBindingDirection.In)
                {
                    context.ObjectValue = context.NativeValue;
                }
                else if (context.BindValue != null && context.ObjectValue == Value)
                {
                    context.NativeValue = context.ObjectValue;
                }
            });

            var result = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ExecutionId = 3,
                ObjectId    = 1,
                MethodId    = 2,
                Parameters  = new object[] { Value }
            });

            Assert.Equal(Value, result.Result as string);
        }
예제 #11
0
        public async Task MethodParameterCountMismatchThrows()
        {
            var methodExecutor = new MethodExecutor <object>(
                new ReadOnlyDictionary <long, ObjectDescriptor>(
                    new Dictionary <long, ObjectDescriptor>()
            {
                { 1, ObjectDescriptor.Create().WithMethods(new List <MethodDescriptor>()
                    {
                        MethodDescriptor.Create().WithId(2).WithParameterCount(2).Get()
                    }).WithId(1).Get() }
            }), context => { });

            var result = await methodExecutor.Execute(new MethodExecution <object>()
            {
                ObjectId   = 1,
                MethodId   = 2,
                Parameters = new object[] { }
            });

            Assert.Equal("Parameter count mismatch.", result.Error);
            Assert.False(result.Success);
        }