using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xunit;
using Xunit.Abstractions;
using Xunit.Extensions;
using Xunit.Sdk;

namespace xUnitStudy.WebApi.Test
{
    /// <summary>
    /// 使用 xUnit
    /// 测试类不需要加任何特性
    /// NUnit需要加TestFixture特性,MSTest需要加TestClass特性
    /// </summary>
    [Trait(name:"测试类分组",value:"包括类内所有测试方法")]
    public class UseXUnitTest:IDisposable
    {
        /// <summary>
        /// 每次测试前的准备
        /// 构造函数 替代 SetUp或TestInitialize,进行初始化
        /// </summary>
        public UseXUnitTest()
        {

        }

        /// <summary>
        /// 每次测试后的清理
        /// 实现IDisposable接口,替代TearDown或TestCleanup 进行清理释放操作
        /// </summary>
        public void Dispose()
        {
            
        }

        /// <summary>
        /// Fact特性,标识测试方法
        /// </summary>
        [Fact]
        public void Use_Fact_Test()
        {
            //永久通过测试断言的写法
            Assert.True(true,"Fact特性,表示测试方法");
        }

        [Fact(DisplayName = "定制测试方法名称")]
        public void Use_Fact_DisplayName_Test()
        {
            Assert.True(true,"使用Fact特性的DisplayName属性,表示:定制的测试方法名称");
        }

        [Fact(Skip = "暂时忽略测试")]
        public void Use_Fact_Skip_Test()
        {
            Assert.True(true,"使用Fact特性的Skip属性,表示:暂时忽略测试");
        }

        /// <summary>
        /// 使用Fact特性的Timeout参数
        /// 设置:测试方法超时时间(豪秒)
        /// </summary>
        [Fact(Timeout =1000)]
        public void Use_Fact_Timeout_Test()
        {
            Assert.True(true,"使用Fact特性的Timeout属性,设置:测试方法超时时间(豪秒)");
        }

        /// <summary>
        /// 分组测试,可以按分组显示测试结果
        /// Trait可用于:程序集(AssemblyInfo.cs文件中)、测试类和测试方法三个层次
        /// 一个测试方法同时属于多外组
        /// </summary>
        [Fact]
        [Trait(name:"测试方法分组",value:"红队")]
        [Trait(name:"测试方法分组",value:"蓝队")]
        public void Use_Trait_Test()
        {
            Assert.True(true,"使用Trait特性,设置:测试分组,测试结果可以按组显示");
        }

        /// <summary>
        /// 测试方法分组:红队
        /// </summary>
        [Fact]
        [Trait(name: "测试方法分组", value: "红队")]
        public void Use_Trait_Red_Test()
        {
            Assert.True(true, "使用Trait特性,设置:测试分组,测试结果可以按组显示");
        }

        /// <summary>
        /// 测试方法分组:蓝队
        /// </summary>
        [Fact]
        [Trait(name: "测试方法分组", value: "蓝队")]
        public void Use_Trait_Blue_Test()
        {
            Assert.True(true, "使用Trait特性,设置:测试分组,测试结果可以按组显示");
        }

        [Theory]
        [InlineData(1)]
        [InlineData(2)]
        [InlineData(3)]
        [InlineData(4)]
        public void Use_Theory_Test(int number)
        {
            var userPara = number;

            Assert.True(true,"使用Theory特性和InlineData特性,传递不同参数,多次执行测试");
        }
    }
}