/// <summary>
        /// Run the given <paramref name="scenario"/> for <paramref name="count"/> number of iterations parallalelly.
        /// Each iteration will get their own iteration context that will be shared across the scenario steps.
        /// </summary>
        /// <returns>Collection of all <see cref="ScenarioResult"/>.</returns>
        public static async Task <IEnumerable <ScenarioResult> > RunAsync(ScenarioDescription scenario, ScenarioContext context, int count)
        {
            List <Task>           tasks   = new List <Task>();
            List <ScenarioResult> results = new List <ScenarioResult>();

            for (int i = 0; i < count; i++)
            {
                using (var iterationContext = new ScenarioContext(context))
                {
                    var result = new ScenarioResult(scenario);
                    results.Add(result);
                    tasks.Add(Task.Run(() => result.Run(iterationContext)));
                }
            }

            await Task.WhenAll(tasks.ToArray());

            return(results);
        }
        /// <summary>
        /// Create <see cref="ScenarioDescription"/> from <paramref name="json"/> using
        /// steps defined in <paramref name="types"/>.
        /// </summary>
        /// <returns>A scenario description of steps in json</returns>
        public static ScenarioDescription FromJson(string description, string json, params Type[] types)
        {
            var definedSteps = GetStepDefinitions(types);
            var steps        = JsonConvert.DeserializeObject <StepDefinition[]>(json);

            var scenarioSteps = new List <ScenarioStep>();

            for (int i = 0; i < steps.Length; i++)
            {
                var found = definedSteps.FirstOrDefault(
                    s => s.GetMethodInfo().GetCustomAttribute <StepAttribute>().Name == steps[i].Action);

                if (found == null)
                {
                    throw new Exception($"{steps[i].Action} not found in Step definitions");
                }
                scenarioSteps.Add(found);
            }

            var scenario = new ScenarioDescription(description, scenarioSteps.ToArray());

            return(scenario);
        }
 public ScenarioResult(ScenarioDescription scenario)
 {
     Scenario = scenario;
 }