Skip to content

Commit

Permalink
Remove DataRowAttribute argument count limitation (#1646)
Browse files Browse the repository at this point in the history
  • Loading branch information
Evangelink committed May 3, 2023
1 parent 738eabc commit 1a33b1d
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 283 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,17 @@ internal static void InvokeAsSynchronousTask(this MethodInfo methodInfo, object?
throw new TestFailedException(ObjectModel.UnitTestOutcome.Error, Resource.UTA_TestMethodExpectedParameters);
}

var task = methodInfo.Invoke(classInstance, parameters) as Task;
Task? task;
if (parameters is not null
&& methodParameters?.Length == 1
&& methodParameters[0].ParameterType == typeof(object[]))
{
task = methodInfo.Invoke(classInstance, new[] { parameters }) as Task;
}
else
{
task = methodInfo.Invoke(classInstance, parameters) as Task;
}

// If methodInfo is an Async method, wait for returned task
task?.GetAwaiter().GetResult();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,275 +19,34 @@ public class DataRowAttribute : Attribute, ITestDataSource
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class.
/// </summary>
public DataRowAttribute()
=> Data = Array.Empty<object>();
: this(Array.Empty<object>())
{
}

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class.
/// </summary>
/// <param name="arg1"> The first argument. </param>
// Need to have this constructor explicitly to fix a CLS compliance error.
public DataRowAttribute(object? arg1)
=> Data = new object?[] { arg1 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
public DataRowAttribute(object? arg1, object? arg2)
=> Data = new object?[] { arg1, arg2 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3)
=> Data = new object?[] { arg1, arg2, arg3 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4)
=> Data = new object?[] { arg1, arg2, arg3, arg4 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5)
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6)
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7)
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8)
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9)
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10)
=> Data = new object?[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 };

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
/// <param name="arg11"> The eleventh argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11)
=> Data = new object?[]
{
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
};

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
/// <param name="arg11"> The eleventh argument. </param>
/// <param name="arg12"> The twelfth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12)
=> Data = new object?[]
{
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12,
};

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
/// <param name="arg11"> The eleventh argument. </param>
/// <param name="arg12"> The twelfth argument. </param>
/// <param name="arg13"> The thirteen argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13)
=> Data = new object?[]
{
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
arg12, arg13,
};

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
/// <param name="arg11"> The eleventh argument. </param>
/// <param name="arg12"> The twelfth argument. </param>
/// <param name="arg13"> The thirteen argument. </param>
/// <param name="arg14"> The fourteenth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13,
object? arg14)
=> Data = new object?[]
{
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
arg12, arg13, arg14,
};
/// <param name="stringArrayData"> The string array data. </param>
public DataRowAttribute(string?[]? stringArrayData)
: this(new object?[] { stringArrayData })
{
}

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
/// <param name="arg11"> The eleventh argument. </param>
/// <param name="arg12"> The twelfth argument. </param>
/// <param name="arg13"> The thirteen argument. </param>
/// <param name="arg14"> The fourteenth argument. </param>
/// <param name="arg15"> The fifteenth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13,
object? arg14, object? arg15)
=> Data = new object?[]
/// <param name="data"> The data. </param>
public DataRowAttribute(params object?[]? data)
{
if (data == null)
{
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
arg12, arg13, arg14, arg15,
};

/// <summary>
/// Initializes a new instance of the <see cref="DataRowAttribute"/> class which takes in an array of arguments.
/// </summary>
/// <param name="arg1"> The first argument. </param>
/// <param name="arg2"> The second argument. </param>
/// <param name="arg3"> The third argument. </param>
/// <param name="arg4"> The fourth argument. </param>
/// <param name="arg5"> The fifth argument. </param>
/// <param name="arg6"> The sixth argument. </param>
/// <param name="arg7"> The seventh argument. </param>
/// <param name="arg8"> The eight argument. </param>
/// <param name="arg9"> The nineth argument. </param>
/// <param name="arg10"> The tenth argument. </param>
/// <param name="arg11"> The eleventh argument. </param>
/// <param name="arg12"> The twelfth argument. </param>
/// <param name="arg13"> The thirteen argument. </param>
/// <param name="arg14"> The fourteenth argument. </param>
/// <param name="arg15"> The fifteenth argument. </param>
/// <param name="arg16"> The sixteenth argument. </param>
public DataRowAttribute(object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6,
object? arg7, object? arg8, object? arg9, object? arg10, object? arg11, object? arg12, object? arg13,
object? arg14, object? arg15, object? arg16)
=> Data = new object?[]
Data = new object?[] { null };
}
else
{
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11,
arg12, arg13, arg14, arg15, arg16,
};
Data = data;
}
}

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

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

return null;
var parameters = methodInfo.GetParameters();

// We want to force call to `data.AsEnumerable()` to ensure that objects are casted to strings (using ToString())
// so that null do appear as "null". If you remove the call, and do string.Join(",", new object[] { null, "a" }),
// you will get empty string while with the call you will get "null,a".
IEnumerable<object?> displayData = parameters.Length == 1 && parameters[0].ParameterType == typeof(object[])
? new object[] { data.AsEnumerable() }
: data.AsEnumerable();

return string.Format(CultureInfo.CurrentCulture, FrameworkMessages.DataDrivenResultDisplayName, methodInfo.Name,
string.Join(",", displayData));
}
}

0 comments on commit 1a33b1d

Please sign in to comment.