public async Task Call_Async_Methods_With_Parameters()
        {
            var mock1 = Substitute.For <IMockClass>();

            mock1.Method4Async(1, 2).Returns(Guid.NewGuid().ToString());
            var mock2 = Substitute.For <IMockClass>();

            mock2.Method4Async(3, 4).Returns(Guid.NewGuid().ToString());
            var mock3 = Substitute.For <IMockClass>();

            mock3.Method4Async(1, 2).Returns(Task <string> .Factory.StartNew(() => throw new Exception()));
            var mock4 = Substitute.For <IMockClass>();

            mock4.Method4Async(3, 4).Returns(Task <string> .Factory.StartNew(() => throw new Exception()));

            var result1 = await AlwaysResult.For <IMockClass>(mock1).InvokeAsync(c => c.Method4Async(1, 2));

            var result2 = await AlwaysResult.For <IMockClass>(mock2).InvokeAsync(c => c.Method4Async(3, 4));

            var result3 = await AlwaysResult.For <IMockClass>(mock3).InvokeAsync(c => c.Method4Async(1, 2));

            var result4 = await AlwaysResult.For <IMockClass>(mock4).InvokeAsync(c => c.Method4Async(3, 4));

            Assert.Equal(result1, result3);
            Assert.Equal(result2, result4);
        }
        public void Call_Method_Without_Parameters_And_Get_Result()
        {
            var mock = Substitute.For <IMockClass>();

            mock.Method1().Returns(Guid.NewGuid().ToString());
            var result1 = AlwaysResult.For <IMockClass>(mock).Invoke(m => m.Method1());

            mock.Method1().Returns(x => { throw new Exception(); });
            var result2 = AlwaysResult.For <IMockClass>(mock).Invoke(m => m.Method1());

            Assert.Equal(result1, result2);
        }
        public async Task Call_Async_Methods_Without_Parameters()
        {
            var mock1 = Substitute.For <IMockClass>();

            mock1.Method3Async().Returns(Guid.NewGuid().ToString());
            var mock2 = Substitute.For <IMockClass>();

            mock2.Method3Async().Returns(Task <string> .Factory.StartNew(() => throw new Exception()));

            var result1Task = AlwaysResult.For <IMockClass>(mock1).InvokeAsync(c => c.Method3Async());
            var result2Task = AlwaysResult.For <IMockClass>(mock2).InvokeAsync(c => c.Method3Async());

            Assert.Equal(await result1Task, await result2Task);
        }
        public void Call_Method_With_ExceptionHandler()
        {
            var mock = Substitute.For <IMockClass>();

            mock.Method2("test", 1).Returns("test");
            AlwaysResult.For <IMockClass>(mock).Invoke(c => c.Method2("test", 1));

            mock.Method2("test", 1).Returns(x => { throw new Exception(); });
            AlwaysResult.For <IMockClass>(mock)
            .WithExceptionHandler((ex) => mock.Method1())
            .Invoke(c => c.Method2("test", 1));

            mock.Received().Method1();
        }
        public async Task Call_Async_Method_With_ExceptionHandler()
        {
            var mock = Substitute.For <IMockClass>();

            var mock1 = Substitute.For <IMockClass>();

            mock1.Method3Async().Returns("test");
            var mock2 = Substitute.For <IMockClass>();

            mock2.Method3Async().Returns(Task <string> .Factory.StartNew(() => throw new Exception()));

            await AlwaysResult.For <IMockClass>(mock1).InvokeAsync(c => c.Method3Async());

            await AlwaysResult.For <IMockClass>(mock2)
            .WithExceptionHandler((ex) => mock.Method1())
            .InvokeAsync(c => c.Method3Async());

            mock.Received().Method1();
        }
        public void Call_Method_With_Parameter_And_Get_Result()
        {
            var paramStr1 = "test1";
            var paramStr2 = "test2";
            var paramInt1 = 1;
            var paramInt2 = 2;

            var mock = Substitute.For <IMockClass>();

            mock.Method2(paramStr1, paramInt1).Returns($"{Guid.NewGuid()}_{paramStr1}_{paramInt1}");
            var result11 = AlwaysResult.For <IMockClass>(mock).Invoke(c => c.Method2(paramStr1, paramInt1));

            mock.Method2(paramStr2, paramInt2).Returns($"{Guid.NewGuid()}_{paramStr2}_{paramInt2}");
            var result12 = AlwaysResult.For <IMockClass>(mock).Invoke(c => c.Method2(paramStr2, paramInt2));

            mock.Method2(paramStr1, paramInt1).Returns(x => { throw new Exception(); });
            var result21 = AlwaysResult.For <IMockClass>(mock).Invoke(c => c.Method2(paramStr1, paramInt1));

            mock.Method2(paramStr2, paramInt2).Returns(x => { throw new Exception(); });
            var result22 = AlwaysResult.For <IMockClass>(mock).Invoke(c => c.Method2(paramStr2, paramInt2));

            Assert.Equal(result11, result21);
            Assert.Equal(result12, result22);
        }