csharp/0x1000000/SqExpress/Test/SqExpress.IntTest/Context/IScenario.cs

IScenario.cs
using System.Collections.Generic;
using System.Threading.Tasks;

namespace SqExpress.IntTest.Context
{
    public interface IScenario
    {
        Task Exec(IScenarioContext context);
    }

    public static clast ScenarioExt
    {
        public static IScenario Then(this IScenario scenario1, IScenario scenario2)
        {
            var result = scenario1 is ScenarioList list ? list : new ScenarioList(scenario1);

            result.Add(scenario2);

            return result;
        }

        private clast ScenarioList : IScenario
        {
            private readonly List _scenarios = new List();

            public ScenarioList(IScenario first)
            {
                this._scenarios.Add(first);
            }

            public async Task Exec(IScenarioContext context)
            {
                foreach (var scenario in this._scenarios)
                {
                    context.WriteLine($"--{scenario.GetType().Name}--");
                    context.WriteLine(null);

                    await scenario.Exec(context);
                    context.WriteLine(null);
                }
            }

            public void Add(IScenario scenario)
            {
                if (scenario is ScenarioList sl)
                {
                    this._scenarios.AddRange(sl._scenarios);
                }
                else
                {
                    this._scenarios.Add(scenario);
                }
            }
        }
    }
}