Skip to content

Commit 4b6e83d

Browse files
Add validation for multiple Params* attributes, fix #1877
1 parent e07363b commit 4b6e83d

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

src/BenchmarkDotNet/Validators/ParamsValidator.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ private IEnumerable<ValidationError> Validate(Type type)
3636
string name = $"{type.Name}.{memberInfo.Name}";
3737
string? attributeString = string.Join(", ", attributes.Select(attribute => $"[{attribute.GetType().Name.Replace(nameof(Attribute), "")}]"));
3838

39+
if (attributes.Count > 1)
40+
yield return new ValidationError(TreatsWarningsAsErrors,
41+
$"Unable to use {name} with {attributeString} at the same time. Please, use a single attribute.");
42+
3943
if (memberInfo is FieldInfo fieldInfo && (fieldInfo.IsLiteral || fieldInfo.IsInitOnly))
4044
{
4145
string modifier = fieldInfo.IsInitOnly ? "readonly" : "constant";

tests/BenchmarkDotNet.Tests/Validators/ParamsValidatorTests.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ private void Check<T>(params string[] messageParts)
4848
[Fact] public void NonStaticReadonly1Test() => Check<NonStaticReadonly1>(nameof(NonStaticReadonly1.Input), "readonly", P);
4949
[Fact] public void NonStaticReadonly2Test() => Check<NonStaticReadonly2>(nameof(NonStaticReadonly2.Input), "readonly", Pa);
5050
[Fact] public void NonStaticReadonly3Test() => Check<NonStaticReadonly3>(nameof(NonStaticReadonly3.Input), "readonly", Ps);
51+
[Fact] public void FieldMultiple1Test() => Check<FieldMultiple1>(nameof(FieldMultiple1.Input), "single attribute", P, Pa);
52+
[Fact] public void FieldMultiple2Test() => Check<FieldMultiple2>(nameof(FieldMultiple2.Input), "single attribute", P, Ps);
53+
[Fact] public void FieldMultiple3Test() => Check<FieldMultiple3>(nameof(FieldMultiple3.Input), "single attribute", Pa, Ps);
54+
[Fact] public void FieldMultiple4Test() => Check<FieldMultiple4>(nameof(FieldMultiple4.Input), "single attribute", P, Pa, Ps);
55+
[Fact] public void PropMultiple1Test() => Check<PropMultiple1>(nameof(PropMultiple1.Input), "single attribute", P, Pa);
56+
[Fact] public void PropMultiple2Test() => Check<PropMultiple2>(nameof(PropMultiple2.Input), "single attribute", P, Ps);
57+
[Fact] public void PropMultiple3Test() => Check<PropMultiple3>(nameof(PropMultiple3.Input), "single attribute", Pa, Ps);
58+
[Fact] public void PropMultiple4Test() => Check<PropMultiple4>(nameof(PropMultiple4.Input), "single attribute", P, Pa, Ps);
5159

5260
public class Base
5361
{
@@ -110,5 +118,63 @@ public class NonStaticReadonly3 : Base
110118
[ParamsSource(nameof(Source))]
111119
public readonly bool Input = false;
112120
}
121+
122+
public class FieldMultiple1 : Base
123+
{
124+
[Params(false, true)]
125+
[ParamsAllValues]
126+
public bool Input = false;
127+
}
128+
129+
public class FieldMultiple2 : Base
130+
{
131+
[Params(false, true)]
132+
[ParamsSource(nameof(Source))]
133+
public bool Input = false;
134+
}
135+
136+
public class FieldMultiple3 : Base
137+
{
138+
[ParamsAllValues]
139+
[ParamsSource(nameof(Source))]
140+
public bool Input = false;
141+
}
142+
143+
public class FieldMultiple4 : Base
144+
{
145+
[Params(false, true)]
146+
[ParamsAllValues]
147+
[ParamsSource(nameof(Source))]
148+
public bool Input = false;
149+
}
150+
151+
public class PropMultiple1 : Base
152+
{
153+
[Params(false, true)]
154+
[ParamsAllValues]
155+
public bool Input { get; set; }
156+
}
157+
158+
public class PropMultiple2 : Base
159+
{
160+
[Params(false, true)]
161+
[ParamsSource(nameof(Source))]
162+
public bool Input { get; set; }
163+
}
164+
165+
public class PropMultiple3 : Base
166+
{
167+
[ParamsAllValues]
168+
[ParamsSource(nameof(Source))]
169+
public bool Input { get; set; }
170+
}
171+
172+
public class PropMultiple4 : Base
173+
{
174+
[Params(false, true)]
175+
[ParamsAllValues]
176+
[ParamsSource(nameof(Source))]
177+
public bool Input { get; set; }
178+
}
113179
}
114180
}

0 commit comments

Comments
 (0)