namespace OptionsPattern.Sutdy.Uncover
{
    public class UseXunitTest:IDisposable
    {
        private readonly ITestOutputHelper? _output;
        public UseXunitTest(ITestOutputHelperAccessor outputHelperAccessor)
        {
            if (outputHelperAccessor == null)
            {
                throw new ArgumentNullException(nameof(outputHelperAccessor));
            }
            _output = outputHelperAccessor.Output;
        }

        
        /// <summary>
        /// xUnit 可用性测试
        /// </summary>
        [Fact]
        public void UsabilityTest()
        {
            Assert.True(true, "使用xUnit测试框架!");
            _output?.WriteLine("使用 xUnit 框架输出信息测试!");
        }

        /// <summary>
        /// 断言不发生异常
        /// 使用:xUnit 变通方法
        /// </summary>
        [Fact]
        public void DoesNotThrow_Test()
        {
            //待执行代码段
            Action codeSnippet = () =>
            {
                //业务代码

                //模拟异常
                //throw new Exception("我是特意抛出的异常!");
            };

            var exception = Record.Exception(codeSnippet);
            Assert.Null(exception);

            _output?.WriteLine("使用 xUnit 变通方法,断言不发生异常!");
        }

        /// <summary>
        /// 断言不发生异常
        /// 使用:FluentAssertions 库方式,断言不发生异常
        /// </summary>
        [Fact]
        public void DoesNotThrow_UseFluentAssertions_Test()
        {
            //待执行代码段
            Action codeSnippet= () =>
            {
                //业务代码

                //模拟异常
                //throw new Exception("我是特意抛出的异常!");
            };

            //断言:不发生异常
            codeSnippet.Should().NotThrow();

            _output?.WriteLine("使用 FluentAssertions 库方式,断言不发生异常!");
        }

        public void Dispose()
        {
        }
    }
}