public static async Task Run(List<RunDescriptor> runDescriptors, List<EndpointBehavior> behaviorDescriptors, List<IScenarioVerification> shoulds, Func<ScenarioContext, bool> done, Action<RunSummary> reports)
{
var totalRuns = runDescriptors.Count;
var results = new ConcurrentBag<RunSummary>();
try
{
foreach (var runDescriptor in runDescriptors)
{
Console.WriteLine("{0} - Started @ {1}", runDescriptor.Key, DateTime.Now.ToString(CultureInfo.InvariantCulture));
ContextAppenderFactory.SetContext(runDescriptor.ScenarioContext);
var runResult = await PerformTestRun(behaviorDescriptors, shoulds, runDescriptor, done).ConfigureAwait(false);
ContextAppenderFactory.SetContext(null);
Console.WriteLine("{0} - Finished @ {1}", runDescriptor.Key, DateTime.Now.ToString(CultureInfo.InvariantCulture));
results.Add(new RunSummary
{
Result = runResult,
RunDescriptor = runDescriptor,
Endpoints = behaviorDescriptors
});
if (runResult.Failed)
{
break;
}
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Test run aborted due to test failures");
}
var failedRuns = results.Where(s => s.Result.Failed).ToList();
foreach (var runSummary in failedRuns)
{
DisplayRunResult(runSummary, totalRuns);
}
if (failedRuns.Count == 1)
{
throw failedRuns[0].Result.Exception;
}
if (failedRuns.Count > 1)
{
throw new AggregateException("Test run failed due to multiple exceptions", failedRuns.Select(f => f.Result.Exception)).Flatten();
}
foreach (var runSummary in results.Where(s => !s.Result.Failed))
{
DisplayRunResult(runSummary, totalRuns);
reports?.Invoke(runSummary);
}
}