diff --git a/src/BenchmarkDotNet/Code/CodeGenerator.cs b/src/BenchmarkDotNet/Code/CodeGenerator.cs index 005564b77c..9a6228dd88 100644 --- a/src/BenchmarkDotNet/Code/CodeGenerator.cs +++ b/src/BenchmarkDotNet/Code/CodeGenerator.cs @@ -56,6 +56,7 @@ internal static string Generate(BuildPartition buildPartition) .Replace("$OverheadImplementation$", provider.OverheadImplementation) .Replace("$ConsumeField$", provider.ConsumeField) .Replace("$JobSetDefinition$", GetJobsSetDefinition(benchmark)) + .Replace("$ParamsInitializer$", GetParamsInitializer(benchmark)) .Replace("$ParamsContent$", GetParamsContent(benchmark)) .Replace("$ArgumentsDefinition$", GetArgumentsDefinition(benchmark)) .Replace("$DeclareArgumentFields$", GetDeclareArgumentFields(benchmark)) @@ -186,7 +187,15 @@ private static DeclarationsProvider GetDeclarationsProvider(Descriptor descripto return new NonVoidDeclarationsProvider(descriptor); } + private static string GetParamsInitializer(BenchmarkCase benchmarkCase) + => string.Join( + ", ", + benchmarkCase.Parameters.Items + .Where(parameter => !parameter.IsArgument && !parameter.IsStatic) + .Select(parameter => $"{parameter.Name} = default")); + // internal for tests + internal static string GetParamsContent(BenchmarkCase benchmarkCase) => string.Join( string.Empty, diff --git a/src/BenchmarkDotNet/Templates/BenchmarkType.txt b/src/BenchmarkDotNet/Templates/BenchmarkType.txt index f17737d646..ea1bbaa858 100644 --- a/src/BenchmarkDotNet/Templates/BenchmarkType.txt +++ b/src/BenchmarkDotNet/Templates/BenchmarkType.txt @@ -3,7 +3,7 @@ { public static void Run(BenchmarkDotNet.Engines.IHost host, System.String benchmarkName) { - BenchmarkDotNet.Autogenerated.Runnable_$ID$ instance = new BenchmarkDotNet.Autogenerated.Runnable_$ID$(); // do NOT change name "instance" (used in SmartParamameter) + BenchmarkDotNet.Autogenerated.Runnable_$ID$ instance = new BenchmarkDotNet.Autogenerated.Runnable_$ID$ { $ParamsInitializer$ }; // do NOT change name "instance" (used in SmartParamameter) $ParamsContent$ host.WriteLine(); diff --git a/tests/BenchmarkDotNet.IntegrationTests/ParamsTests.cs b/tests/BenchmarkDotNet.IntegrationTests/ParamsTests.cs index 0285856bcb..0f703bf1cd 100644 --- a/tests/BenchmarkDotNet.IntegrationTests/ParamsTests.cs +++ b/tests/BenchmarkDotNet.IntegrationTests/ParamsTests.cs @@ -217,5 +217,28 @@ public void Test() throw new ArgumentException($"{nameof(StaticParamProperty)} has wrong value: {StaticParamProperty}!"); } } + +#if NET8_0_OR_GREATER + [Fact] + public void ParamsSupportRequiredProperty() + { + var summary = CanExecute(); + var standardOutput = GetCombinedStandardOutput(summary); + + foreach (var param in new[] { "a", "b" }) + { + Assert.Contains($"// ### New Parameter {param} ###", standardOutput); + } + } + + public class ParamsTestRequiredProperty + { + [Params("a", "b")] + public required string ParamProperty { get; set; } + + [Benchmark] + public void Benchmark() => Console.WriteLine($"// ### New Parameter {ParamProperty} ###"); + } +#endif } } \ No newline at end of file