Skip to content

Commit e3f8573

Browse files
authored
feat(mocks): discriminate generic-method mocks by type argument (#6153)
* feat(mocks): discriminate generic-method mocks by type argument TUnit.Mocks recorded only (memberId, arg-matchers) as the match key, so a generic method's type arguments were dropped at the runtime boundary. Setups that differ only by type argument (e.g. Greet<Class1>() vs Greet<Class2>(), discussion #4981) collided and the last one always won. Thread an optional Type[]? typeArguments (closed typeof(T) at the call site) through setup registration, call dispatch, and verification: - MethodSetup/CallRecord carry the type arguments; MockEngine gains object[]+Type[] HandleCall/HandleCallWithReturn overloads and a TypeArgumentsMatch gate in FindMatchingSetup. CallVerificationBuilder filters recorded calls by type argument. - The source generator emits `new Type[] { typeof(T), ... }` for generic methods, routing them through the fallback dispatch (typed dispatch can't carry type args) while preserving any auto-mock factory. - Add AnyType/AnyValueType wildcard markers (TUnit.Mocks.Arguments) so a setup can match any type argument. Base/interface-constrained type params support exact matching only; partial/wrap virtual methods record no type args and are not discriminated (documented graceful degradation). Non-generic methods carry null and behave exactly as before. Note: FindMatchingSetup keeps a no-default (int, object?[]) overload distinct from the type-arg overload so it still wins resolution over generic FindMatchingSetup<T1>. Adds regression + wildcard + verification tests; updates generic-method snapshots. * test(mocks): add multi-type-parameter generic-method tests Cover discrimination by the full ordered type-argument list (T1,T2 order sensitivity), partial wildcards (one AnyType + one concrete), exact-wins-over- partial-wildcard, and multi-type-param verification including wildcard counts. * refactor(mocks): dedup type-args literal + collapse redundant ctors - Reuse MockImplBuilder.TypeArgumentsArrayLiteral from MockMembersBuilder instead of re-building the 'new Type[] { typeof(T), ... }' string inline. - Collapse MockMethodCall (2->1) and VoidMockMethodCall (4->2) constructors using optional parameters; overload resolution and call sites unchanged. No behavior or generated-output change (snapshots unchanged). * perf(mocks): cache generic type-arg arrays + show type args in verify failures Review feedback on PR #6153: - Cache a generic method's type-argument array per closed instantiation (TypeArguments.Of<T>.Value) for the common 1-2 type-param cases, so dispatch no longer allocates a new Type[] on every generic call. Higher arities still emit a per-call literal. (Codacy perf finding #1.) - Include type arguments in MockVerificationException's expected-call text, so a failed Greet<Class1>() verification reads 'Greet<Class1>(...)' not 'Greet(...)'. Adds a regression test. (Review finding #5.) * perf+dx(mocks): extend type-arg cache to arity 3-4, friendlier verify names, AnyValueType test Follow-up to PR #6153 review: - Extend TypeArguments.Of<> cache to 3 and 4 type parameters (was 1-2), so 3-4 type-param generic methods also avoid per-call Type[] allocation. Doc the shared arrays as read-only / never-mutate. - Strip the CLR arity suffix in verification failure messages (List, not List`1). - Add tests proving AnyValueType works as a wildcard for 'where T : struct' parameters (not dead code) and that struct-constrained methods discriminate by exact type argument. * fix(mocks): keep generic type-arg support fully backwards compatible Earlier commits in this PR introduced two breaking changes to pre-existing public types. Reverted while keeping the feature: - IMockEngineAccess: removed the added CreateVerification overload (a source break for any external implementer of this public interface). Generic type-argument verification now routes through a new internal ITypeArgumentVerificationFactory, implemented only by MockEngine and reached via an internal cast. Non-generic verification stays on the unchanged public surface. - MockMethodCall / VoidMockMethodCall: restored the original constructor signatures that the simplify pass had collapsed into optional-parameter ctors (a binary break), adding the type-argument overloads alongside instead of replacing them. The public API delta for the whole PR is now additions-only: new constructor overloads plus the new public types AnyType, AnyValueType and TypeArguments. No generated-code or snapshot changes. 1013 integration, 62 snapshot and 30 analyzer tests pass; runtime builds on all TFMs including netstandard2.0. * docs(mocks): consolidate repeated read-only note in TypeArguments Fold the identical per-field 'shared, read-only' comment on the four Of<>.Value fields into the class-level doc. Comment-only. * fix(mocks): degrade gracefully instead of casting when engine lacks type-arg verification A custom IMockEngineAccess implementation passed to a generic MockMethodCall/ VoidMockMethodCall previously hit a hard InvalidCastException at verification time. Replace the cast with a type test that falls back to the public, non-filtering verification surface. A default interface method on IMockEngineAccess is not viable while the library targets netstandard2.0. * fix(mocks): thread type args through ordered verification + immutable type-arg arrays Round 7 review fixes: - OrderedVerification now records and matches a generic expectation's type arguments, so VerifyInOrder discriminates Greet<Class1>() from Greet<Class2>() like unordered verification does. Failure messages include the type arguments. Regression tests added. - Type-argument arrays are now ImmutableArray<Type> end-to-end (TypeArguments.Of<T>.Value, MethodSetup, CallRecord, engine dispatch, verification), closing the mutable-shared-array corruption risk while keeping array-speed indexed access on the hot matching path. The arity-5+ generator fallback emits ImmutableArray.Create. All affected signatures were introduced on this branch, so no released surface changes. - CreateVerification routing deduped into MockCallVerification.Create, shared by MockMethodCall and VoidMockMethodCall. - Documented why the typed FindMatchingSetup<T1..T8> family omits a TypeArgumentsMatch check: typed dispatch never carries call-side type arguments, so the check would be a constant true (non-generic setups have none; virtual/partial generic methods use the documented degradation path). * docs(mocks): note AnyValueType is exact-match-only under additional struct constraints
1 parent 3f7920a commit e3f8573

21 files changed

Lines changed: 710 additions & 107 deletions

TUnit.Mocks.SourceGenerator.Tests/Snapshots/Interface_FluentUI_Shape_Nullable_Warnings.verified.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ file sealed class IDialogReferenceMockImpl : global::IDialogReference, global::T
3434
{
3535
try
3636
{
37-
var __result = _engine.HandleCallWithReturn<T?>(0, "GetReturnValueAsync", global::System.Array.Empty<object?>(), default);
37+
var __result = _engine.HandleCallWithReturn<T?>(0, "GetReturnValueAsync", global::System.Array.Empty<object?>(), default, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
3838
if (global::TUnit.Mocks.Setup.RawReturnContext.TryConsume(out var __rawAsync))
3939
{
4040
if (__rawAsync is global::System.Threading.Tasks.Task<T?> __typedAsync) return __typedAsync;
@@ -95,7 +95,7 @@ public static class IDialogReference_MockMemberExtensions
9595
public static global::TUnit.Mocks.MockMethodCall<T?> GetReturnValueAsync<T>(this global::TUnit.Mocks.Mock<global::IDialogReference> mock)
9696
{
9797
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
98-
return new global::TUnit.Mocks.MockMethodCall<T?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetReturnValueAsync", matchers);
98+
return new global::TUnit.Mocks.MockMethodCall<T?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetReturnValueAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
9999
}
100100

101101
#if NET9_0_OR_GREATER
@@ -238,7 +238,7 @@ file sealed class IDialogServiceMockImpl : global::IDialogService, global::TUnit
238238
{
239239
try
240240
{
241-
var __result = _engine.HandleCallWithReturn<global::IDialogReference?, string, global::DialogParameters<TData>>(0, "UpdateDialogAsync", id, parameters, default, static __behavior => global::IDialogReferenceMockFactory.CreateAutoMock(__behavior));
241+
var __result = _engine.HandleCallWithReturn<global::IDialogReference?>(0, "UpdateDialogAsync", new object?[] { id, parameters }, default, static __behavior => global::IDialogReferenceMockFactory.CreateAutoMock(__behavior), global::TUnit.Mocks.TypeArguments.Of<TData>.Value);
242242
if (global::TUnit.Mocks.Setup.RawReturnContext.TryConsume(out var __rawAsync))
243243
{
244244
if (__rawAsync is global::System.Threading.Tasks.Task<global::IDialogReference?> __typedAsync) return __typedAsync;
@@ -256,7 +256,7 @@ file sealed class IDialogServiceMockImpl : global::IDialogService, global::TUnit
256256
{
257257
try
258258
{
259-
var __result = _engine.HandleCallWithReturn<global::IDialogReference, object, global::DialogParameters>(1, "ShowDialogAsync", data, parameters, default!, static __behavior => global::IDialogReferenceMockFactory.CreateAutoMock(__behavior));
259+
var __result = _engine.HandleCallWithReturn<global::IDialogReference>(1, "ShowDialogAsync", new object?[] { data, parameters }, default!, static __behavior => global::IDialogReferenceMockFactory.CreateAutoMock(__behavior), global::TUnit.Mocks.TypeArguments.Of<TDialog>.Value);
260260
if (global::TUnit.Mocks.Setup.RawReturnContext.TryConsume(out var __rawAsync))
261261
{
262262
if (__rawAsync is global::System.Threading.Tasks.Task<global::IDialogReference> __typedAsync) return __typedAsync;
@@ -347,57 +347,57 @@ public static class IDialogService_MockMemberExtensions
347347
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference?> UpdateDialogAsync<TData>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::TUnit.Mocks.Arguments.Arg<string> id, global::TUnit.Mocks.Arguments.Arg<global::DialogParameters<TData>> parameters) where TData : class
348348
{
349349
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { id.Matcher, parameters.Matcher };
350-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers);
350+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TData>.Value);
351351
}
352352

353353
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference?> UpdateDialogAsync<TData>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::System.Func<string, bool> id, global::TUnit.Mocks.Arguments.Arg<global::DialogParameters<TData>> parameters) where TData : class
354354
{
355355
global::TUnit.Mocks.Arguments.Arg<string> __fa_id = id;
356356
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { __fa_id.Matcher, parameters.Matcher };
357-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers);
357+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TData>.Value);
358358
}
359359

360360
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference?> UpdateDialogAsync<TData>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::TUnit.Mocks.Arguments.Arg<string> id, global::System.Func<global::DialogParameters<TData>, bool> parameters) where TData : class
361361
{
362362
global::TUnit.Mocks.Arguments.Arg<global::DialogParameters<TData>> __fa_parameters = parameters;
363363
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { id.Matcher, __fa_parameters.Matcher };
364-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers);
364+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TData>.Value);
365365
}
366366

367367
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference?> UpdateDialogAsync<TData>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::System.Func<string, bool> id, global::System.Func<global::DialogParameters<TData>, bool> parameters) where TData : class
368368
{
369369
global::TUnit.Mocks.Arguments.Arg<string> __fa_id = id;
370370
global::TUnit.Mocks.Arguments.Arg<global::DialogParameters<TData>> __fa_parameters = parameters;
371371
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { __fa_id.Matcher, __fa_parameters.Matcher };
372-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers);
372+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference?>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "UpdateDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TData>.Value);
373373
}
374374

375375
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference> ShowDialogAsync<TDialog>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::TUnit.Mocks.Arguments.Arg<object> data, global::TUnit.Mocks.Arguments.Arg<global::DialogParameters> parameters) where TDialog : global::IDialogContentComponent
376376
{
377377
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { data.Matcher, parameters.Matcher };
378-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers);
378+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TDialog>.Value);
379379
}
380380

381381
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference> ShowDialogAsync<TDialog>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::System.Func<object, bool> data, global::TUnit.Mocks.Arguments.Arg<global::DialogParameters> parameters) where TDialog : global::IDialogContentComponent
382382
{
383383
global::TUnit.Mocks.Arguments.Arg<object> __fa_data = data;
384384
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { __fa_data.Matcher, parameters.Matcher };
385-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers);
385+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TDialog>.Value);
386386
}
387387

388388
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference> ShowDialogAsync<TDialog>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::TUnit.Mocks.Arguments.Arg<object> data, global::System.Func<global::DialogParameters, bool> parameters) where TDialog : global::IDialogContentComponent
389389
{
390390
global::TUnit.Mocks.Arguments.Arg<global::DialogParameters> __fa_parameters = parameters;
391391
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { data.Matcher, __fa_parameters.Matcher };
392-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers);
392+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TDialog>.Value);
393393
}
394394

395395
public static global::TUnit.Mocks.MockMethodCall<global::IDialogReference> ShowDialogAsync<TDialog>(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::System.Func<object, bool> data, global::System.Func<global::DialogParameters, bool> parameters) where TDialog : global::IDialogContentComponent
396396
{
397397
global::TUnit.Mocks.Arguments.Arg<object> __fa_data = data;
398398
global::TUnit.Mocks.Arguments.Arg<global::DialogParameters> __fa_parameters = parameters;
399399
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { __fa_data.Matcher, __fa_parameters.Matcher };
400-
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers);
400+
return new global::TUnit.Mocks.MockMethodCall<global::IDialogReference>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "ShowDialogAsync", matchers, global::TUnit.Mocks.TypeArguments.Of<TDialog>.Value);
401401
}
402402

403403
public static void RaiseOnShow(this global::TUnit.Mocks.Mock<global::IDialogService> mock, global::IDialogReference arg1, global::System.Type? arg2, global::DialogParameters arg3, object arg4)

TUnit.Mocks.SourceGenerator.Tests/Snapshots/Interface_With_Generic_Method_Constraints_On_Explicit_Impl.verified.txt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,32 @@ file sealed class IConstrainedMockImpl : global::IConstrained, global::TUnit.Moc
4242

4343
public T GetNotnull<T>(string key) where T : notnull
4444
{
45-
return _engine.HandleCallWithReturn<T, string>(0, "GetNotnull", key, default!);
45+
return _engine.HandleCallWithReturn<T>(0, "GetNotnull", new object?[] { key }, default!, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
4646
}
4747

4848
public T GetNew<T>() where T : new()
4949
{
50-
return _engine.HandleCallWithReturn<T>(1, "GetNew", global::System.Array.Empty<object?>(), default!);
50+
return _engine.HandleCallWithReturn<T>(1, "GetNew", global::System.Array.Empty<object?>(), default!, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
5151
}
5252

5353
public T GetUnmanaged<T>() where T : struct, unmanaged
5454
{
55-
return _engine.HandleCallWithReturn<T>(2, "GetUnmanaged", global::System.Array.Empty<object?>(), default);
55+
return _engine.HandleCallWithReturn<T>(2, "GetUnmanaged", global::System.Array.Empty<object?>(), default, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
5656
}
5757

5858
public T GetDisposable<T>() where T : global::System.IDisposable
5959
{
60-
return _engine.HandleCallWithReturn<T>(3, "GetDisposable", global::System.Array.Empty<object?>(), default!);
60+
return _engine.HandleCallWithReturn<T>(3, "GetDisposable", global::System.Array.Empty<object?>(), default!, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
6161
}
6262

6363
public T GetClassNew<T>() where T : class, global::System.IDisposable, new()
6464
{
65-
return _engine.HandleCallWithReturn<T>(4, "GetClassNew", global::System.Array.Empty<object?>(), default!);
65+
return _engine.HandleCallWithReturn<T>(4, "GetClassNew", global::System.Array.Empty<object?>(), default!, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
6666
}
6767

6868
public T GetStructDisposable<T>() where T : struct, global::System.IDisposable
6969
{
70-
return _engine.HandleCallWithReturn<T>(5, "GetStructDisposable", global::System.Array.Empty<object?>(), default);
70+
return _engine.HandleCallWithReturn<T>(5, "GetStructDisposable", global::System.Array.Empty<object?>(), default, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
7171
}
7272

7373
[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
@@ -117,44 +117,44 @@ public static class IConstrained_MockMemberExtensions
117117
public static global::TUnit.Mocks.MockMethodCall<T> GetNotnull<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock, global::TUnit.Mocks.Arguments.Arg<string> key) where T : notnull
118118
{
119119
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { key.Matcher };
120-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetNotnull", matchers);
120+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetNotnull", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
121121
}
122122

123123
public static global::TUnit.Mocks.MockMethodCall<T> GetNotnull<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock, global::System.Func<string, bool> key) where T : notnull
124124
{
125125
global::TUnit.Mocks.Arguments.Arg<string> __fa_key = key;
126126
var matchers = new global::TUnit.Mocks.Arguments.IArgumentMatcher[] { __fa_key.Matcher };
127-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetNotnull", matchers);
127+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetNotnull", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
128128
}
129129

130130
public static global::TUnit.Mocks.MockMethodCall<T> GetNew<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock) where T : new()
131131
{
132132
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
133-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "GetNew", matchers);
133+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 1, "GetNew", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
134134
}
135135

136136
public static global::TUnit.Mocks.MockMethodCall<T> GetUnmanaged<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock) where T : struct, unmanaged
137137
{
138138
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
139-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 2, "GetUnmanaged", matchers);
139+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 2, "GetUnmanaged", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
140140
}
141141

142142
public static global::TUnit.Mocks.MockMethodCall<T> GetDisposable<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock) where T : global::System.IDisposable
143143
{
144144
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
145-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 3, "GetDisposable", matchers);
145+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 3, "GetDisposable", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
146146
}
147147

148148
public static global::TUnit.Mocks.MockMethodCall<T> GetClassNew<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock) where T : class, global::System.IDisposable, new()
149149
{
150150
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
151-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 4, "GetClassNew", matchers);
151+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 4, "GetClassNew", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
152152
}
153153

154154
public static global::TUnit.Mocks.MockMethodCall<T> GetStructDisposable<T>(this global::TUnit.Mocks.Mock<global::IConstrained> mock) where T : struct, global::System.IDisposable
155155
{
156156
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
157-
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 5, "GetStructDisposable", matchers);
157+
return new global::TUnit.Mocks.MockMethodCall<T>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 5, "GetStructDisposable", matchers, global::TUnit.Mocks.TypeArguments.Of<T>.Value);
158158
}
159159

160160
#if NET9_0_OR_GREATER

0 commit comments

Comments
 (0)