-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMaaDataAttribute.cs
More file actions
182 lines (159 loc) · 7.63 KB
/
MaaDataAttribute.cs
File metadata and controls
182 lines (159 loc) · 7.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
using System.Reflection;
namespace MaaFramework.Binding.UnitTests;
#pragma warning disable CA1019 // 定义属性参数的访问器
/// <inheritdoc/>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MaaDataAttribute : DataRowAttribute, ITestDataSource
{
private readonly string _maaDataSourceName;
private readonly MaaTypes _maaInteropTypes;
private readonly TypeInfo _commonTypeInfo = typeof(Common).GetTypeInfo();
/// <inheritdoc/>
public override string? GetDisplayName(MethodInfo methodInfo, object?[]? data)
=> string.IsNullOrWhiteSpace(DisplayName)
? base.GetDisplayName(methodInfo, data)
: $"{data?.First(static d => d is MaaTypes)}: {DisplayName}";
/// <inheritdoc/>
IEnumerable<object?[]> ITestDataSource.GetData(MethodInfo methodInfo)
{
foreach (var maaObject in GetMaaObjects(methodInfo))
{
if (!_maaInteropTypes.HasFlag(maaObject.Key))
continue;
foreach (var data in GetData(methodInfo))
{
var array = new object?[data.Length + 2];
array[0] = maaObject.Key;
array[1] = maaObject.Value;
for (var i = 0; i < data.Length; i++)
{
array[i + 2] = CheckArgument(methodInfo, data[i]);
}
yield return array;
}
}
}
/// <remarks>
/// NewData
/// </remarks>
private IEnumerable<KeyValuePair<MaaTypes, object>> GetMaaObjects(MethodInfo methodInfo)
{
var declaredMethods = methodInfo.DeclaringType?.GetTypeInfo().GetDeclaredMethods(_maaDataSourceName);
if (declaredMethods?.Any() is true)
{
var declaredMethod = declaredMethods.First(
x => x.GetParameters().Length == 1
&& x.GetParameters()[0].ParameterType.IsAssignableFrom(typeof(MaaTypes))
&& methodInfo.GetParameters()[1].ParameterType.IsAssignableFrom(x.ReturnType));
List<KeyValuePair<MaaTypes, object>> retList = [];
foreach (var maaTypeObject in Enum.GetValuesAsUnderlyingType<MaaTypes>())
{
var maaType = (MaaTypes)maaTypeObject;
try
{
var declaredMethodReturn = declaredMethod.Invoke(null, [maaType])!;
retList.Add(new KeyValuePair<MaaTypes, object>(maaType, declaredMethodReturn));
}
catch (TargetInvocationException e) when (e.InnerException is NotImplementedException)
{
// continue
}
}
return retList;
}
var declaredProperty = (methodInfo.DeclaringType?.GetTypeInfo().GetDeclaredProperty(_maaDataSourceName))
?? throw new ArgumentNullException($"{DynamicDataSourceType.Property} {_maaDataSourceName} not exists.");
var obj = declaredProperty.GetValue(null, null)
?? throw new ArgumentNullException($"{_maaDataSourceName}.GetValue returns null.");
var ret = obj switch
{
IEnumerable<KeyValuePair<MaaTypes, object>> enumerable
=> enumerable.ToArray(),
IEnumerable<KeyValuePair<MaaTypes, object[]>> enumerable
=> [.. from data in enumerable
from maaObject in data.Value
where methodInfo.GetParameters()[1].ParameterType.IsInstanceOfType(maaObject)
select new KeyValuePair<MaaTypes, object>(data.Key, maaObject)],
_ => [],
};
if (ret.Length == 0)
throw new ArgumentException($"{_maaDataSourceName} does not have the required type ({methodInfo.GetParameters()[1].ParameterType.FullName}).");
return ret;
}
private object? CheckArgument(MethodInfo methodInfo, object? arg)
{
if (arg is not string str || string.IsNullOrWhiteSpace(str))
return arg;
// Gets the Property from test class or common class.
var val = methodInfo.DeclaringType?.GetTypeInfo().GetDeclaredProperty(str)?.GetValue(null, null)
?? _commonTypeInfo.GetDeclaredProperty(str)?.GetValue(null, null);
return val ?? arg;
}
/// <summary>
/// Initializes a new instance of the <see cref="MaaDataAttribute"/> class.
/// </summary>
/// <param name="maaInteropTypes">The MaaInteropTypes.</param>
/// <param name="maaDataSourceName">The name of maa data source.</param>
/// <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 MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7)
: base(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?,object?,object?,object?,object?,object?,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6)
: base(arg1, arg2, arg3, arg4, arg5, arg6)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?,object?,object?,object?,object?,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5)
: base(arg1, arg2, arg3, arg4, arg5)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?,object?,object?,object?,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1, object? arg2, object? arg3, object? arg4)
: base(arg1, arg2, arg3, arg4)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?,object?,object?,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1, object? arg2, object? arg3)
: base(arg1, arg2, arg3)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?,object?,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1, object? arg2)
: base(arg1, arg2)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName, object? arg1)
: base(arg1)
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
/// <inheritdoc cref="MaaDataAttribute(MaaTypes,string,object?)"/>
public MaaDataAttribute(MaaTypes maaInteropTypes, string maaDataSourceName)
: base()
{
_maaDataSourceName = maaDataSourceName;
_maaInteropTypes = maaInteropTypes;
}
}