Skip to content

Commit 1a33b1d

Browse files
authored
Remove DataRowAttribute argument count limitation (#1646)
1 parent 738eabc commit 1a33b1d

File tree

4 files changed

+44
-283
lines changed

4 files changed

+44
-283
lines changed

src/Adapter/MSTest.TestAdapter/Extensions/MethodInfoExtensions.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,17 @@ internal static void InvokeAsSynchronousTask(this MethodInfo methodInfo, object?
152152
throw new TestFailedException(ObjectModel.UnitTestOutcome.Error, Resource.UTA_TestMethodExpectedParameters);
153153
}
154154

155-
var task = methodInfo.Invoke(classInstance, parameters) as Task;
155+
Task? task;
156+
if (parameters is not null
157+
&& methodParameters?.Length == 1
158+
&& methodParameters[0].ParameterType == typeof(object[]))
159+
{
160+
task = methodInfo.Invoke(classInstance, new[] { parameters }) as Task;
161+
}
162+
else
163+
{
164+
task = methodInfo.Invoke(classInstance, parameters) as Task;
165+
}
156166

157167
// If methodInfo is an Async method, wait for returned task
158168
task?.GetAwaiter().GetResult();

src/TestFramework/TestFramework/Attributes/DataSource/DataRowAttribute.cs

+31-266
Original file line numberDiff line numberDiff line change
@@ -19,275 +19,34 @@ public class DataRowAttribute : Attribute, ITestDataSource
1919
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class.
2020
/// </summary>
2121
public DataRowAttribute()
22-
=> Data = Array.Empty<object>();
22+
: this(Array.Empty<object>())
23+
{
24+
}
2325

2426
/// <summary>
2527
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class.
2628
/// </summary>
27-
/// <param name="arg1"> The first argument. </param>
28-
// Need to have this constructor explicitly to fix a CLS compliance error.
29-
public DataRowAttribute(object? arg1)
30-
=> Data = new object?[] { arg1 };
31-
32-
/// <summary>
33-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
34-
/// </summary>
35-
/// <param name="arg1"> The first argument. </param>
36-
/// <param name="arg2"> The second argument. </param>
37-
public DataRowAttribute(object? arg1, object? arg2)
38-
=> Data = new object?[] { arg1, arg2 };
39-
40-
/// <summary>
41-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
42-
/// </summary>
43-
/// <param name="arg1"> The first argument. </param>
44-
/// <param name="arg2"> The second argument. </param>
45-
/// <param name="arg3"> The third argument. </param>
46-
public DataRowAttribute(object? arg1, object? arg2, object? arg3)
47-
=> Data = new object?[] { arg1, arg2, arg3 };
48-
49-
/// <summary>
50-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
51-
/// </summary>
52-
/// <param name="arg1"> The first argument. </param>
53-
/// <param name="arg2"> The second argument. </param>
54-
/// <param name="arg3"> The third argument. </param>
55-
/// <param name="arg4"> The fourth argument. </param>
56-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4)
57-
=> Data = new object?[] { arg1, arg2, arg3, arg4 };
58-
59-
/// <summary>
60-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
61-
/// </summary>
62-
/// <param name="arg1"> The first argument. </param>
63-
/// <param name="arg2"> The second argument. </param>
64-
/// <param name="arg3"> The third argument. </param>
65-
/// <param name="arg4"> The fourth argument. </param>
66-
/// <param name="arg5"> The fifth argument. </param>
67-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5)
68-
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5 };
69-
70-
/// <summary>
71-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
72-
/// </summary>
73-
/// <param name="arg1"> The first argument. </param>
74-
/// <param name="arg2"> The second argument. </param>
75-
/// <param name="arg3"> The third argument. </param>
76-
/// <param name="arg4"> The fourth argument. </param>
77-
/// <param name="arg5"> The fifth argument. </param>
78-
/// <param name="arg6"> The sixth argument. </param>
79-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6)
80-
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6 };
81-
82-
/// <summary>
83-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
84-
/// </summary>
85-
/// <param name="arg1"> The first argument. </param>
86-
/// <param name="arg2"> The second argument. </param>
87-
/// <param name="arg3"> The third argument. </param>
88-
/// <param name="arg4"> The fourth argument. </param>
89-
/// <param name="arg5"> The fifth argument. </param>
90-
/// <param name="arg6"> The sixth argument. </param>
91-
/// <param name="arg7"> The seventh argument. </param>
92-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
93-
object? arg7)
94-
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7 };
95-
96-
/// <summary>
97-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
98-
/// </summary>
99-
/// <param name="arg1"> The first argument. </param>
100-
/// <param name="arg2"> The second argument. </param>
101-
/// <param name="arg3"> The third argument. </param>
102-
/// <param name="arg4"> The fourth argument. </param>
103-
/// <param name="arg5"> The fifth argument. </param>
104-
/// <param name="arg6"> The sixth argument. </param>
105-
/// <param name="arg7"> The seventh argument. </param>
106-
/// <param name="arg8"> The eight argument. </param>
107-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
108-
object? arg7, object? arg8)
109-
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 };
110-
111-
/// <summary>
112-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
113-
/// </summary>
114-
/// <param name="arg1"> The first argument. </param>
115-
/// <param name="arg2"> The second argument. </param>
116-
/// <param name="arg3"> The third argument. </param>
117-
/// <param name="arg4"> The fourth argument. </param>
118-
/// <param name="arg5"> The fifth argument. </param>
119-
/// <param name="arg6"> The sixth argument. </param>
120-
/// <param name="arg7"> The seventh argument. </param>
121-
/// <param name="arg8"> The eight argument. </param>
122-
/// <param name="arg9"> The nineth argument. </param>
123-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
124-
object? arg7, object? arg8, object? arg9)
125-
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 };
126-
127-
/// <summary>
128-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
129-
/// </summary>
130-
/// <param name="arg1"> The first argument. </param>
131-
/// <param name="arg2"> The second argument. </param>
132-
/// <param name="arg3"> The third argument. </param>
133-
/// <param name="arg4"> The fourth argument. </param>
134-
/// <param name="arg5"> The fifth argument. </param>
135-
/// <param name="arg6"> The sixth argument. </param>
136-
/// <param name="arg7"> The seventh argument. </param>
137-
/// <param name="arg8"> The eight argument. </param>
138-
/// <param name="arg9"> The nineth argument. </param>
139-
/// <param name="arg10"> The tenth argument. </param>
140-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
141-
object? arg7, object? arg8, object? arg9, object? arg10)
142-
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 };
143-
144-
/// <summary>
145-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
146-
/// </summary>
147-
/// <param name="arg1"> The first argument. </param>
148-
/// <param name="arg2"> The second argument. </param>
149-
/// <param name="arg3"> The third argument. </param>
150-
/// <param name="arg4"> The fourth argument. </param>
151-
/// <param name="arg5"> The fifth argument. </param>
152-
/// <param name="arg6"> The sixth argument. </param>
153-
/// <param name="arg7"> The seventh argument. </param>
154-
/// <param name="arg8"> The eight argument. </param>
155-
/// <param name="arg9"> The nineth argument. </param>
156-
/// <param name="arg10"> The tenth argument. </param>
157-
/// <param name="arg11"> The eleventh argument. </param>
158-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
159-
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11)
160-
=> Data = new object?[]
161-
{
162-
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
163-
};
164-
165-
/// <summary>
166-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
167-
/// </summary>
168-
/// <param name="arg1"> The first argument. </param>
169-
/// <param name="arg2"> The second argument. </param>
170-
/// <param name="arg3"> The third argument. </param>
171-
/// <param name="arg4"> The fourth argument. </param>
172-
/// <param name="arg5"> The fifth argument. </param>
173-
/// <param name="arg6"> The sixth argument. </param>
174-
/// <param name="arg7"> The seventh argument. </param>
175-
/// <param name="arg8"> The eight argument. </param>
176-
/// <param name="arg9"> The nineth argument. </param>
177-
/// <param name="arg10"> The tenth argument. </param>
178-
/// <param name="arg11"> The eleventh argument. </param>
179-
/// <param name="arg12"> The twelfth argument. </param>
180-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
181-
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12)
182-
=> Data = new object?[]
183-
{
184-
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12,
185-
};
186-
187-
/// <summary>
188-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
189-
/// </summary>
190-
/// <param name="arg1"> The first argument. </param>
191-
/// <param name="arg2"> The second argument. </param>
192-
/// <param name="arg3"> The third argument. </param>
193-
/// <param name="arg4"> The fourth argument. </param>
194-
/// <param name="arg5"> The fifth argument. </param>
195-
/// <param name="arg6"> The sixth argument. </param>
196-
/// <param name="arg7"> The seventh argument. </param>
197-
/// <param name="arg8"> The eight argument. </param>
198-
/// <param name="arg9"> The nineth argument. </param>
199-
/// <param name="arg10"> The tenth argument. </param>
200-
/// <param name="arg11"> The eleventh argument. </param>
201-
/// <param name="arg12"> The twelfth argument. </param>
202-
/// <param name="arg13"> The thirteen argument. </param>
203-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
204-
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13)
205-
=> Data = new object?[]
206-
{
207-
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
208-
arg12, arg13,
209-
};
210-
211-
/// <summary>
212-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
213-
/// </summary>
214-
/// <param name="arg1"> The first argument. </param>
215-
/// <param name="arg2"> The second argument. </param>
216-
/// <param name="arg3"> The third argument. </param>
217-
/// <param name="arg4"> The fourth argument. </param>
218-
/// <param name="arg5"> The fifth argument. </param>
219-
/// <param name="arg6"> The sixth argument. </param>
220-
/// <param name="arg7"> The seventh argument. </param>
221-
/// <param name="arg8"> The eight argument. </param>
222-
/// <param name="arg9"> The nineth argument. </param>
223-
/// <param name="arg10"> The tenth argument. </param>
224-
/// <param name="arg11"> The eleventh argument. </param>
225-
/// <param name="arg12"> The twelfth argument. </param>
226-
/// <param name="arg13"> The thirteen argument. </param>
227-
/// <param name="arg14"> The fourteenth argument. </param>
228-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
229-
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13,
230-
object? arg14)
231-
=> Data = new object?[]
232-
{
233-
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
234-
arg12, arg13, arg14,
235-
};
29+
/// <param name="stringArrayData"> The string array data. </param>
30+
public DataRowAttribute(string?[]? stringArrayData)
31+
: this(new object?[] { stringArrayData })
32+
{
33+
}
23634

23735
/// <summary>
23836
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
23937
/// </summary>
240-
/// <param name="arg1"> The first argument. </param>
241-
/// <param name="arg2"> The second argument. </param>
242-
/// <param name="arg3"> The third argument. </param>
243-
/// <param name="arg4"> The fourth argument. </param>
244-
/// <param name="arg5"> The fifth argument. </param>
245-
/// <param name="arg6"> The sixth argument. </param>
246-
/// <param name="arg7"> The seventh argument. </param>
247-
/// <param name="arg8"> The eight argument. </param>
248-
/// <param name="arg9"> The nineth argument. </param>
249-
/// <param name="arg10"> The tenth argument. </param>
250-
/// <param name="arg11"> The eleventh argument. </param>
251-
/// <param name="arg12"> The twelfth argument. </param>
252-
/// <param name="arg13"> The thirteen argument. </param>
253-
/// <param name="arg14"> The fourteenth argument. </param>
254-
/// <param name="arg15"> The fifteenth argument. </param>
255-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
256-
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13,
257-
object? arg14, object? arg15)
258-
=> Data = new object?[]
38+
/// <param name="data"> The data. </param>
39+
public DataRowAttribute(params object?[]? data)
40+
{
41+
if (data == null)
25942
{
260-
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
261-
arg12, arg13, arg14, arg15,
262-
};
263-
264-
/// <summary>
265-
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
266-
/// </summary>
267-
/// <param name="arg1"> The first argument. </param>
268-
/// <param name="arg2"> The second argument. </param>
269-
/// <param name="arg3"> The third argument. </param>
270-
/// <param name="arg4"> The fourth argument. </param>
271-
/// <param name="arg5"> The fifth argument. </param>
272-
/// <param name="arg6"> The sixth argument. </param>
273-
/// <param name="arg7"> The seventh argument. </param>
274-
/// <param name="arg8"> The eight argument. </param>
275-
/// <param name="arg9"> The nineth argument. </param>
276-
/// <param name="arg10"> The tenth argument. </param>
277-
/// <param name="arg11"> The eleventh argument. </param>
278-
/// <param name="arg12"> The twelfth argument. </param>
279-
/// <param name="arg13"> The thirteen argument. </param>
280-
/// <param name="arg14"> The fourteenth argument. </param>
281-
/// <param name="arg15"> The fifteenth argument. </param>
282-
/// <param name="arg16"> The sixteenth argument. </param>
283-
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
284-
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13,
285-
object? arg14, object? arg15, object? arg16)
286-
=> Data = new object?[]
43+
Data = new object?[] { null };
44+
}
45+
else
28746
{
288-
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
289-
arg12, arg13, arg14, arg15, arg16,
290-
};
47+
Data = data;
48+
}
49+
}
29150

29251
/// <summary>
29352
/// Gets data for calling test method.
@@ -313,15 +72,21 @@ public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4,
31372
return DisplayName;
31473
}
31574

316-
if (data != null)
75+
if (data == null)
31776
{
318-
// We want to force call to `data.AsEnumerable()` to ensure that objects are casted to strings (using ToString())
319-
// so that null do appear as "null". If you remove the call, and do string.Join(",", new object[] { null, "a" }),
320-
// you will get empty string while with the call you will get "null,a".
321-
return string.Format(CultureInfo.CurrentCulture, FrameworkMessages.DataDrivenResultDisplayName, methodInfo.Name,
322-
string.Join(",", data.AsEnumerable()));
77+
return null;
32378
}
32479

325-
return null;
80+
var parameters = methodInfo.GetParameters();
81+
82+
// We want to force call to `data.AsEnumerable()` to ensure that objects are casted to strings (using ToString())
83+
// so that null do appear as "null". If you remove the call, and do string.Join(",", new object[] { null, "a" }),
84+
// you will get empty string while with the call you will get "null,a".
85+
IEnumerable<object?> displayData = parameters.Length == 1 && parameters[0].ParameterType == typeof(object[])
86+
? new object[] { data.AsEnumerable() }
87+
: data.AsEnumerable();
88+
89+
return string.Format(CultureInfo.CurrentCulture, FrameworkMessages.DataDrivenResultDisplayName, methodInfo.Name,
90+
string.Join(",", displayData));
32691
}
32792
}

0 commit comments

Comments
 (0)