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;

using xUnitStudy.Model;

namespace xUnitStudy.WebApi.Test
{
    /// <summary>
    /// 测试用例级别的共享
    /// </summary>
    public class UseFixtureTest:IDisposable
    {
        /* 学习
           测试时,无论是针对一些比较耗费资源的对象亦或是为了支持Test case预设数据的能力,我们都需要有一些初始化或是清理相关的动作。
           在每个测试用例执行前和执行后,可能需要执行相同的准备和清理工作。
           本例方法1:放在构造函数和IDisposable接口的实现方法Dispose()中
           执行流程:
                    用例b:创建测试类实例 --> 构造函数 --> 用例1 --> Dispose()方法 --> 结束测试类实例 --> 完成

                    用例a:创建测试类实例 --> 构造函数 --> 用例2 --> Dispose()方法 --> 结束测试类实例 --> 完成

                    用例x:创建测试类实例 --> 构造函数 --> 用例2 --> Dispose()方法 --> 结束测试类实例 --> 完成

                    用例m:创建测试类实例 --> 构造函数 --> 用例2 --> Dispose()方法 --> 结束测试类实例 --> 完成

                    ........

                    所有用例完成

          注意:用例执行的先后顺序由xUnit框架指定,且先后顺序不固定。尤其是并行执行时,执行顺序和返回顺序更不确定。
                所以,各单元测试是完全独立的,相互之间不能存在任何依赖,特别是执行顺序、执行结果、共享数据。
        */

        object sharedData;
        public UseFixtureTest()
        {
            //测试用例执行前做准备
            sharedData = "sharedate";
        }

        [Fact]
        public void Case2_Test()
        {
            Assert.Equal("sharedate", sharedData.ToString());
        }

        [Fact]
        public void Case1_Test()
        {
            Assert.Equal("sharedate", sharedData.ToString());
        }

        public void Dispose()
        {
            //测试用例执行后做清理
            sharedData = null;
        }
    }
}