/// <inheritdoc/>
        protected override bool TryGetConstructorArgument(ConstructorInfo constructor, int index, ParameterInfo parameter, out object argumentValue)
        {
            if (parameter.ParameterType == typeof(ITestOutputHelper))
            {
                argumentValue = new TestOutputHelper();
                return(true);
            }

            return(ClassFixtureMappings.TryGetValue(parameter.ParameterType, out argumentValue) ||
                   collectionFixtureMappings.TryGetValue(parameter.ParameterType, out argumentValue));
        }
 private Func<InvariantRunner, InvariantConfig> Config
   ( TestOutputHelper output
   )
 {   var attr =
         TestMethod
         .Method
         .GetCustomAttributes(typeof(InvariantAttribute))
         .First();
     var config =
         new InvariantConfig
         { MaxNbOfTest = attr.GetNamedArgument<int>("MaxTest")
         , MaxNbOfFailedTests = attr.GetNamedArgument<int>("MaxFail")
         , StartSize = attr.GetNamedArgument<int>("StartSize")
         , EndSize = attr.GetNamedArgument<int>("EndSize")
         , QuietOnSuccess =
               attr.GetNamedArgument<bool>("QuietOnSuccess")
         , Every =
               attr.GetNamedArgument<bool>("Verbose")
               ? (n, args) =>
                 {   output.WriteLine
                       ( Configuration.Verbose.Every(n, args)
                       );
                     return "";
                 }
               : Configuration.Quick.Every
         , EveryShrink =
               attr.GetNamedArgument<bool>("Verbose")
               ? args =>
                 {   output.WriteLine
                       ( Configuration.Verbose.EveryShrink(args)
                       );
                     return "";
                 }
               : Configuration.Quick.EveryShrink
         , Replay = attr.GetNamedArgument<StdGen>("StdGen")
         };
     return
         runner =>
         {   config.Runner = runner;
             return config;
         };
 }
 #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
 public override async Task<RunSummary> RunAsync
 #pragma warning restore CS1998
   ( IMessageSink diagnosticMessageSink
   , IMessageBus bus
   , object[] constructorArguments
   , ExceptionAggregator aggregator
   , CancellationTokenSource cancellationTokenSource
   )
 {   var summary = new RunSummary();
     var test = new XunitTest(this, DisplayName);
     if (Inv == null)
     {   var msg = "Return Type must be Invariant.";
         bus.QueueMessage
           ( new TestFailed(test, 0, null, new Exception(msg))
           );
         summary.Aggregate(new RunSummary { Total = 1, Failed = 1 });
         return summary;
     }
     var output = new TestOutputHelper();
     var timer = new ExecutionTimer();
     output.Initialize(bus, test);
     bus.QueueMessage(new TestStarting(test));
     InvariantResult result;
     timer.Aggregate(() => result = Inv.Results(Config(output)).First());
     var xresult = ToXunitResult(test, result, timer.Total);
     bus.QueueMessage(xresult.Item1);
     summary.Aggregate(xresult.Item2);
     return summary;
 }