Skip to content

Commit ebc6650

Browse files
committed
Fix assignment of MemberGenericArguments to revert assignment changes from commit f80d9aa
Signed-off-by: Manuel Walz <Manuel.Walz@andrena.de>
1 parent 929d0cb commit ebc6650

3 files changed

Lines changed: 139 additions & 8 deletions

File tree

ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Collections.Generic;
2-
using ArchUnitNET.Loader;
32

43
namespace ArchUnitNET.Domain.Dependencies
54
{
@@ -9,7 +8,7 @@ public MethodCallDependency(IMember originMember, MethodMemberInstance calledMet
98
: base(originMember, calledMethodInstance)
109
{
1110
TargetMember = calledMethodInstance.Member;
12-
TargetMemberGenericArguments = calledMethodInstance.GenericArguments;
11+
TargetMemberGenericArguments = calledMethodInstance.MemberGenericArguments;
1312
}
1413

1514
public IMember TargetMember { get; }

ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,25 @@ public MethodCallDependencyTests()
3333
.FirstOrDefault();
3434
}
3535

36+
[Fact]
37+
public void UsesMemberGenericArguments()
38+
{
39+
var architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture;
40+
var originClass = architecture.GetClassOfType(typeof(ClassWithMethodWithGenericMethodArguments));
41+
var originMember = originClass.GetMembersWithName(nameof(ClassWithMethodWithGenericMethodArguments.Method).BuildMethodMemberName()).Single();
42+
var targetClass = architecture.GetClassOfType(typeof(ClassWithGenericMethodArguments));
43+
var targetMember = targetClass.GetMethodMembersWithName(nameof(ClassWithGenericMethodArguments.Method).BuildMethodMemberName()).Single();
44+
var memberGenericArgument = new GenericArgument(new TypeInstance<IType>(architecture.GetClassOfType(typeof(ClassForGenericArgument))));
45+
var methodCallDependency = new MethodCallDependency(
46+
targetMember,
47+
new MethodMemberInstance(
48+
targetMember,
49+
Enumerable.Empty<GenericArgument>(),
50+
[memberGenericArgument]));
51+
52+
Assert.Contains(memberGenericArgument, methodCallDependency.TargetMemberGenericArguments);
53+
}
54+
3655
[Theory]
3756
[ClassData(typeof(MethodDependencyTestBuild.ConstructorTestData))]
3857
public void ConstructorsAddedToClass(Class classWithConstructors)
@@ -68,6 +87,28 @@ MethodCallDependency expectedDependency
6887
Assert.True(originMember.HasMemberDependency(expectedDependency));
6988
Assert.Contains(expectedDependency, originMember.GetMethodCallDependencies());
7089
}
90+
91+
[Theory]
92+
[ClassData(typeof(MethodDependencyTestBuild.MethodCallGenericConstructorArgumentsDependencyTestData))]
93+
public void MethodCallGenericConstructorArgumentDependenciesAreFound(
94+
IMember originMember,
95+
MethodCallDependency expectedDependency
96+
)
97+
{
98+
Assert.Contains(originMember.GetMethodCallDependencies(),
99+
methodCallDependency => methodCallDependency.TargetGenericArguments.SequenceEqual(expectedDependency.TargetGenericArguments));
100+
}
101+
102+
[Theory]
103+
[ClassData(typeof(MethodDependencyTestBuild.MethodCallGenericMethodArgumentsDependencyTestData))]
104+
public void MethodCallGenericMethodArgumentDependenciesAreFound(
105+
IMember originMember,
106+
MethodCallDependency expectedDependency
107+
)
108+
{
109+
Assert.Contains(originMember.GetMethodCallDependencies(),
110+
methodCallDependency => methodCallDependency.TargetMemberGenericArguments.SequenceEqual(expectedDependency.TargetMemberGenericArguments));
111+
}
71112
}
72113

73114
public class ClassWithMethodA
@@ -99,16 +140,49 @@ public static async void MethodAAsync()
99140
}
100141
}
101142

143+
public class ClassWithMethodWithGenericConstructorArguments
144+
{
145+
public static void Method()
146+
{
147+
var classForGenericArguments = new ClassWithGenericConstructorArguments<ClassForGenericArgument>();
148+
}
149+
}
150+
151+
// ReSharper disable once UnusedTypeParameter
152+
public class ClassWithGenericConstructorArguments<T>;
153+
154+
public class ClassWithMethodWithGenericMethodArguments
155+
{
156+
public static void Method()
157+
{
158+
ClassWithGenericMethodArguments.Method<ClassForGenericArgument>();
159+
}
160+
}
161+
162+
public class ClassWithGenericMethodArguments
163+
{
164+
// ReSharper disable once UnusedTypeParameter
165+
public static void Method<T>()
166+
{
167+
}
168+
}
169+
170+
public class ClassForGenericArgument;
171+
102172
public class ClassWithConstructors
103173
{
104174
private FieldType _fieldTest;
105175
private FieldType _privateFieldTest;
106176

107177
public ClassWithConstructors()
108-
: this(new FieldType()) { }
178+
: this(new FieldType())
179+
{
180+
}
109181

110182
private ClassWithConstructors(FieldType fieldTest)
111-
: this(fieldTest, fieldTest) { }
183+
: this(fieldTest, fieldTest)
184+
{
185+
}
112186

113187
private ClassWithConstructors(FieldType fieldTest, FieldType privateFieldTest)
114188
{

ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
using ArchUnitNET.Domain;
55
using ArchUnitNET.Domain.Dependencies;
66
using ArchUnitNET.Domain.Extensions;
7-
using ArchUnitNET.Loader;
87
using ArchUnitNETTests.Fluent.Extensions;
8+
using JetBrains.Annotations;
99
using Type = System.Type;
1010

1111
namespace ArchUnitNETTests.Domain.Dependencies.Members
@@ -19,7 +19,9 @@ private static object[] BuildMethodCallDependencyTestData(
1919
Type originType,
2020
string nameOfOriginMember,
2121
Type targetType,
22-
string nameOfTargetMember
22+
string nameOfTargetMember,
23+
[CanBeNull] IEnumerable<Type> declaringGenericArgumentsTypes = null,
24+
[CanBeNull] IEnumerable<Type> memberGenericArgumentsTypes = null
2325
)
2426
{
2527
var originClass = Architecture.GetClassOfType(originType);
@@ -30,13 +32,19 @@ string nameOfTargetMember
3032
originMember,
3133
new MethodMemberInstance(
3234
targetMember,
33-
Enumerable.Empty<GenericArgument>(),
34-
Enumerable.Empty<GenericArgument>()
35+
CreateGenericArguments(declaringGenericArgumentsTypes ?? []),
36+
CreateGenericArguments(memberGenericArgumentsTypes ?? [])
3537
)
3638
);
3739
return new object[] { originMember, expectedDependency };
3840
}
3941

42+
private static IEnumerable<GenericArgument> CreateGenericArguments(IEnumerable<Type> classTypes)
43+
{
44+
return classTypes.Select(x => Architecture.GetClassOfType(x))
45+
.Select(x => new GenericArgument(new TypeInstance<Class>(x)));
46+
}
47+
4048
private static object[] BuildMethodSignatureDependencyTestData(
4149
Type originType,
4250
string nameOfOriginMember,
@@ -171,6 +179,56 @@ IEnumerator IEnumerable.GetEnumerator()
171179
}
172180
}
173181

182+
public class MethodCallGenericConstructorArgumentsDependencyTestData : IEnumerable<object[]>
183+
{
184+
private readonly List<object[]> _methodCallDependencyData = new List<object[]>
185+
{
186+
BuildMethodCallDependencyTestData(
187+
typeof(ClassWithMethodWithGenericConstructorArguments),
188+
nameof(ClassWithMethodWithGenericConstructorArguments.Method).BuildMethodMemberName(),
189+
typeof(ClassWithGenericConstructorArguments<>),
190+
StaticConstants.ConstructorNameBase.BuildMethodMemberName(),
191+
[typeof(ClassForGenericArgument)],
192+
[]
193+
)
194+
};
195+
196+
public IEnumerator<object[]> GetEnumerator()
197+
{
198+
return _methodCallDependencyData.GetEnumerator();
199+
}
200+
201+
IEnumerator IEnumerable.GetEnumerator()
202+
{
203+
return GetEnumerator();
204+
}
205+
}
206+
207+
public class MethodCallGenericMethodArgumentsDependencyTestData : IEnumerable<object[]>
208+
{
209+
private readonly List<object[]> _methodCallDependencyData = new List<object[]>
210+
{
211+
BuildMethodCallDependencyTestData(
212+
typeof(ClassWithMethodWithGenericMethodArguments),
213+
nameof(ClassWithMethodWithGenericMethodArguments.Method).BuildMethodMemberName(),
214+
typeof(ClassWithGenericMethodArguments),
215+
nameof(ClassWithGenericMethodArguments.Method).BuildMethodMemberName(),
216+
[],
217+
[typeof(ClassForGenericArgument)]
218+
)
219+
};
220+
221+
public IEnumerator<object[]> GetEnumerator()
222+
{
223+
return _methodCallDependencyData.GetEnumerator();
224+
}
225+
226+
IEnumerator IEnumerable.GetEnumerator()
227+
{
228+
return GetEnumerator();
229+
}
230+
}
231+
174232
public class ConstructorTestData : IEnumerable<object[]>
175233
{
176234
private readonly List<object[]> _methodCallDependencyData = new List<object[]>

0 commit comments

Comments
 (0)