Skip to content

Commit

Permalink
Add validation for multiple Params* attributes, fix #1877
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreyAkinshin committed Mar 6, 2023
1 parent e07363b commit 4b6e83d
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/BenchmarkDotNet/Validators/ParamsValidator.cs
Expand Up @@ -36,6 +36,10 @@ private IEnumerable<ValidationError> Validate(Type type)
string name = $"{type.Name}.{memberInfo.Name}";
string? attributeString = string.Join(", ", attributes.Select(attribute => $"[{attribute.GetType().Name.Replace(nameof(Attribute), "")}]"));

if (attributes.Count > 1)
yield return new ValidationError(TreatsWarningsAsErrors,
$"Unable to use {name} with {attributeString} at the same time. Please, use a single attribute.");

if (memberInfo is FieldInfo fieldInfo && (fieldInfo.IsLiteral || fieldInfo.IsInitOnly))
{
string modifier = fieldInfo.IsInitOnly ? "readonly" : "constant";
Expand Down
66 changes: 66 additions & 0 deletions tests/BenchmarkDotNet.Tests/Validators/ParamsValidatorTests.cs
Expand Up @@ -48,6 +48,14 @@ private void Check<T>(params string[] messageParts)
[Fact] public void NonStaticReadonly1Test() => Check<NonStaticReadonly1>(nameof(NonStaticReadonly1.Input), "readonly", P);
[Fact] public void NonStaticReadonly2Test() => Check<NonStaticReadonly2>(nameof(NonStaticReadonly2.Input), "readonly", Pa);
[Fact] public void NonStaticReadonly3Test() => Check<NonStaticReadonly3>(nameof(NonStaticReadonly3.Input), "readonly", Ps);
[Fact] public void FieldMultiple1Test() => Check<FieldMultiple1>(nameof(FieldMultiple1.Input), "single attribute", P, Pa);
[Fact] public void FieldMultiple2Test() => Check<FieldMultiple2>(nameof(FieldMultiple2.Input), "single attribute", P, Ps);
[Fact] public void FieldMultiple3Test() => Check<FieldMultiple3>(nameof(FieldMultiple3.Input), "single attribute", Pa, Ps);
[Fact] public void FieldMultiple4Test() => Check<FieldMultiple4>(nameof(FieldMultiple4.Input), "single attribute", P, Pa, Ps);
[Fact] public void PropMultiple1Test() => Check<PropMultiple1>(nameof(PropMultiple1.Input), "single attribute", P, Pa);
[Fact] public void PropMultiple2Test() => Check<PropMultiple2>(nameof(PropMultiple2.Input), "single attribute", P, Ps);
[Fact] public void PropMultiple3Test() => Check<PropMultiple3>(nameof(PropMultiple3.Input), "single attribute", Pa, Ps);
[Fact] public void PropMultiple4Test() => Check<PropMultiple4>(nameof(PropMultiple4.Input), "single attribute", P, Pa, Ps);

public class Base
{
Expand Down Expand Up @@ -110,5 +118,63 @@ public class NonStaticReadonly3 : Base
[ParamsSource(nameof(Source))]
public readonly bool Input = false;
}

public class FieldMultiple1 : Base
{
[Params(false, true)]
[ParamsAllValues]
public bool Input = false;
}

public class FieldMultiple2 : Base
{
[Params(false, true)]
[ParamsSource(nameof(Source))]
public bool Input = false;
}

public class FieldMultiple3 : Base
{
[ParamsAllValues]
[ParamsSource(nameof(Source))]
public bool Input = false;
}

public class FieldMultiple4 : Base
{
[Params(false, true)]
[ParamsAllValues]
[ParamsSource(nameof(Source))]
public bool Input = false;
}

public class PropMultiple1 : Base
{
[Params(false, true)]
[ParamsAllValues]
public bool Input { get; set; }
}

public class PropMultiple2 : Base
{
[Params(false, true)]
[ParamsSource(nameof(Source))]
public bool Input { get; set; }
}

public class PropMultiple3 : Base
{
[ParamsAllValues]
[ParamsSource(nameof(Source))]
public bool Input { get; set; }
}

public class PropMultiple4 : Base
{
[Params(false, true)]
[ParamsAllValues]
[ParamsSource(nameof(Source))]
public bool Input { get; set; }
}
}
}

0 comments on commit 4b6e83d

Please sign in to comment.