Skip to content

Commit 3a82c3e

Browse files
Merge pull request #400 from ManuelWalz/fix/use-intended-member-generic-arguments
Fix assignment of MemberGenericArguments
2 parents f742bd9 + 2242b88 commit 3a82c3e

File tree

3 files changed

+170
-6
lines changed

3 files changed

+170
-6
lines changed

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: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,44 @@ public MethodCallDependencyTests()
3333
.FirstOrDefault();
3434
}
3535

36+
[Fact]
37+
public void UsesMemberGenericArguments()
38+
{
39+
var architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture;
40+
var originClass = architecture.GetClassOfType(
41+
typeof(ClassWithMethodWithGenericMethodArguments)
42+
);
43+
var originMember = originClass
44+
.GetMembersWithName(
45+
nameof(ClassWithMethodWithGenericMethodArguments.Method).BuildMethodMemberName()
46+
)
47+
.Single();
48+
var targetClass = architecture.GetClassOfType(typeof(ClassWithGenericMethodArguments));
49+
var targetMember = targetClass
50+
.GetMethodMembersWithName(
51+
nameof(ClassWithGenericMethodArguments.Method).BuildMethodMemberName()
52+
)
53+
.Single();
54+
var memberGenericArgument = new GenericArgument(
55+
new TypeInstance<IType>(
56+
architecture.GetClassOfType(typeof(ClassForGenericArgument))
57+
)
58+
);
59+
var methodCallDependency = new MethodCallDependency(
60+
targetMember,
61+
new MethodMemberInstance(
62+
targetMember,
63+
Enumerable.Empty<GenericArgument>(),
64+
[memberGenericArgument]
65+
)
66+
);
67+
68+
Assert.Contains(
69+
memberGenericArgument,
70+
methodCallDependency.TargetMemberGenericArguments
71+
);
72+
}
73+
3674
[Theory]
3775
[ClassData(typeof(MethodDependencyTestBuild.ConstructorTestData))]
3876
public void ConstructorsAddedToClass(Class classWithConstructors)
@@ -68,6 +106,42 @@ MethodCallDependency expectedDependency
68106
Assert.True(originMember.HasMemberDependency(expectedDependency));
69107
Assert.Contains(expectedDependency, originMember.GetMethodCallDependencies());
70108
}
109+
110+
[Theory]
111+
[ClassData(
112+
typeof(MethodDependencyTestBuild.MethodCallGenericConstructorArgumentsDependencyTestData)
113+
)]
114+
public void MethodCallGenericConstructorArgumentDependenciesAreFound(
115+
IMember originMember,
116+
MethodCallDependency expectedDependency
117+
)
118+
{
119+
Assert.Contains(
120+
originMember.GetMethodCallDependencies(),
121+
methodCallDependency =>
122+
methodCallDependency.TargetGenericArguments.SequenceEqual(
123+
expectedDependency.TargetGenericArguments
124+
)
125+
);
126+
}
127+
128+
[Theory]
129+
[ClassData(
130+
typeof(MethodDependencyTestBuild.MethodCallGenericMethodArgumentsDependencyTestData)
131+
)]
132+
public void MethodCallGenericMethodArgumentDependenciesAreFound(
133+
IMember originMember,
134+
MethodCallDependency expectedDependency
135+
)
136+
{
137+
Assert.Contains(
138+
originMember.GetMethodCallDependencies(),
139+
methodCallDependency =>
140+
methodCallDependency.TargetMemberGenericArguments.SequenceEqual(
141+
expectedDependency.TargetMemberGenericArguments
142+
)
143+
);
144+
}
71145
}
72146

73147
public class ClassWithMethodA
@@ -99,6 +173,34 @@ public static async void MethodAAsync()
99173
}
100174
}
101175

176+
public class ClassWithMethodWithGenericConstructorArguments
177+
{
178+
public static void Method()
179+
{
180+
var classForGenericArguments =
181+
new ClassWithGenericConstructorArguments<ClassForGenericArgument>();
182+
}
183+
}
184+
185+
// ReSharper disable once UnusedTypeParameter
186+
public class ClassWithGenericConstructorArguments<T>;
187+
188+
public class ClassWithMethodWithGenericMethodArguments
189+
{
190+
public static void Method()
191+
{
192+
ClassWithGenericMethodArguments.Method<ClassForGenericArgument>();
193+
}
194+
}
195+
196+
public class ClassWithGenericMethodArguments
197+
{
198+
// ReSharper disable once UnusedTypeParameter
199+
public static void Method<T>() { }
200+
}
201+
202+
public class ClassForGenericArgument;
203+
102204
public class ClassWithConstructors
103205
{
104206
private FieldType _fieldTest;

ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs

Lines changed: 67 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,22 @@ 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(
43+
IEnumerable<Type> classTypes
44+
)
45+
{
46+
return classTypes
47+
.Select(x => Architecture.GetClassOfType(x))
48+
.Select(x => new GenericArgument(new TypeInstance<Class>(x)));
49+
}
50+
4051
private static object[] BuildMethodSignatureDependencyTestData(
4152
Type originType,
4253
string nameOfOriginMember,
@@ -171,6 +182,58 @@ IEnumerator IEnumerable.GetEnumerator()
171182
}
172183
}
173184

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

0 commit comments

Comments
 (0)