Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,93 @@ void M()
return VerifyGeneratorOutput(source);
}

[Test]
public Task Multi_Interface_Mock_With_Secondary_Setup_Surface()
{
var source = """
using TUnit.Mocks;

public interface IMultiLogger
{
void Log(string message);
string LastMessage { get; }
}

public interface IMultiDisposable
{
void Dispose();
bool IsDisposed { get; }
}

public class TestUsage
{
void M()
{
var mock = Mock.Of<IMultiLogger, IMultiDisposable>();
}
}
""";

return VerifyGeneratorOutput(source);
}

[Test]
public Task Multi_Interface_Mock_With_Class_Primary_And_Explicit_Impl()
{
var source = """
using TUnit.Mocks;

public interface IInfra
{
string Instance { get; }
}

public class DataContext : IInfra
{
public virtual string GetName() => "real";
string IInfra.Instance => "real-instance";
}

public class TestUsage
{
void M()
{
var mock = Mock.Of<DataContext, IInfra>();
}
}
""";

return VerifyGeneratorOutput(source);
}

[Test]
public Task Multi_Interface_Mock_With_Conflicting_Member_Names()
{
var source = """
using TUnit.Mocks;

public interface IConflictA
{
string Tag { get; }
}

public interface IConflictB
{
int Tag { get; }
}

public class TestUsage
{
void M()
{
var mock = Mock.Of<IConflictA, IConflictB>();
}
}
""";

return VerifyGeneratorOutput(source);
}

[Test]
public Task Interface_With_Properties()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
// <auto-generated/>
#pragma warning disable
#nullable enable

file sealed class DataContext_IInfraMockImpl : global::DataContext, global::IInfra, global::TUnit.Mocks.IRaisable, global::TUnit.Mocks.IMockObject
{
private readonly global::TUnit.Mocks.MockEngine<global::DataContext> _engine;

[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
global::TUnit.Mocks.IMock? global::TUnit.Mocks.IMockObject.MockWrapper { get; set; }

[global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers]
internal DataContext_IInfraMockImpl(global::TUnit.Mocks.MockEngine<global::DataContext> engine) : base()
{
_engine = engine;
}

public override string GetName()
{
if (_engine.TryHandleCallWithReturn<string>(0, "GetName", global::System.Array.Empty<object?>(), "", out var __result))
{
return __result;
}
return base.GetName();
}

string global::IInfra.Instance
{
get => _engine.HandleCallWithReturn<string>(1, "get_Instance", global::System.Array.Empty<object?>(), "");
}

[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
public void RaiseEvent(string eventName, object? args)
{
throw new global::System.InvalidOperationException($"No event named '{eventName}' exists on this mock.");
}
}

file static class DataContext_IInfraPartialMockFactory
{
[global::System.Runtime.CompilerServices.ModuleInitializer]
internal static void Register()
{
global::TUnit.Mocks.MockRegistry.RegisterMultiFactory(string.Join("|", new[] { typeof(global::DataContext).FullName, typeof(global::IInfra).FullName }), Create);
}

private static readonly int[] _secondaryMap0 = new int[] { 1 };

private static global::TUnit.Mocks.Mock<global::DataContext> Create(global::TUnit.Mocks.MockBehavior behavior, object[] constructorArgs)
{
var engine = new global::TUnit.Mocks.MockEngine<global::DataContext>(behavior);
engine.RegisterSecondaryInterface(typeof(global::IInfra), _secondaryMap0);
var impl = new DataContext_IInfraMockImpl(engine);
engine.Raisable = impl;
var mock = new global::TUnit.Mocks.Mock<global::DataContext>(impl, engine);
return mock;
}
}


// ===== FILE SEPARATOR =====

// <auto-generated/>
#pragma warning disable
#nullable enable

public static class DataContext_IInfra_MockMemberExtensions
{
[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
internal static int __Id(global::TUnit.Mocks.MockEngine<global::DataContext> engine, int localId)
{
if (!engine.TryGetSecondaryMemberId(typeof(global::IInfra), localId, out var memberId))
{
throw new global::System.InvalidOperationException(engine.HasSecondaryInterface(typeof(global::IInfra))
? "Member #" + localId + " of 'IInfra' has no setup mapping on this mock instance — it is not part of this combo's configurable surface."
: "This mock was not created with 'IInfra' as a secondary interface. Create it with Mock.Of<DataContext, IInfra>() to configure its members.");
}
return memberId;
}

extension(global::TUnit.Mocks.Mock<global::DataContext> mock)
{
public global::TUnit.Mocks.PropertyMockCall<string> Instance
{
get
{
var __engine = global::TUnit.Mocks.MockRegistry.GetEngine(mock);
return new(__engine, __Id(__engine, 0), 0, "Instance", true, false);
}
}
}
}


// ===== FILE SEPARATOR =====

// <auto-generated/>
#pragma warning disable
#nullable enable

file sealed class DataContextMockImpl : global::DataContext, global::TUnit.Mocks.IRaisable, global::TUnit.Mocks.IMockObject
{
private readonly global::TUnit.Mocks.MockEngine<global::DataContext> _engine;

[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
global::TUnit.Mocks.IMock? global::TUnit.Mocks.IMockObject.MockWrapper { get; set; }

[global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers]
internal DataContextMockImpl(global::TUnit.Mocks.MockEngine<global::DataContext> engine) : base()
{
_engine = engine;
}

public override string GetName()
{
if (_engine.TryHandleCallWithReturn<string>(0, "GetName", global::System.Array.Empty<object?>(), "", out var __result))
{
return __result;
}
return base.GetName();
}

[global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
public void RaiseEvent(string eventName, object? args)
{
throw new global::System.InvalidOperationException($"No event named '{eventName}' exists on this mock.");
}
}

file static class DataContextPartialMockFactory
{
[global::System.Runtime.CompilerServices.ModuleInitializer]
internal static void Register()
{
global::TUnit.Mocks.MockRegistry.RegisterFactory<global::DataContext>(Create);
}

private static global::TUnit.Mocks.Mock<global::DataContext> Create(global::TUnit.Mocks.MockBehavior behavior, object[] constructorArgs)
{
var engine = new global::TUnit.Mocks.MockEngine<global::DataContext>(behavior);
var impl = new DataContextMockImpl(engine);
engine.Raisable = impl;
var mock = new global::TUnit.Mocks.Mock<global::DataContext>(impl, engine);
return mock;
}
}


// ===== FILE SEPARATOR =====

// <auto-generated/>
#pragma warning disable
#nullable enable

public static class DataContext_MockMemberExtensions
{
public static global::TUnit.Mocks.MockMethodCall<string> GetName(this global::TUnit.Mocks.Mock<global::DataContext> mock)
{
var matchers = global::System.Array.Empty<global::TUnit.Mocks.Arguments.IArgumentMatcher>();
return new global::TUnit.Mocks.MockMethodCall<string>(global::TUnit.Mocks.MockRegistry.GetEngine(mock), 0, "GetName", matchers);
}

#if NET9_0_OR_GREATER
[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static void Reset(this global::TUnit.Mocks.Mock<global::DataContext> mock)
=> global::TUnit.Mocks.Mock.Reset(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static void VerifyAll(this global::TUnit.Mocks.Mock<global::DataContext> mock)
=> global::TUnit.Mocks.Mock.VerifyAll(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static void VerifyNoOtherCalls(this global::TUnit.Mocks.Mock<global::DataContext> mock)
=> global::TUnit.Mocks.Mock.VerifyNoOtherCalls(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static void SetupAllProperties(this global::TUnit.Mocks.Mock<global::DataContext> mock)
=> global::TUnit.Mocks.Mock.SetupAllProperties(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static global::TUnit.Mocks.Diagnostics.MockDiagnostics GetDiagnostics(this global::TUnit.Mocks.Mock<global::DataContext> mock)
=> global::TUnit.Mocks.Mock.GetDiagnostics(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static void SetState(this global::TUnit.Mocks.Mock<global::DataContext> mock, string? stateName)
=> global::TUnit.Mocks.Mock.SetState(mock, stateName);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public static void InState(this global::TUnit.Mocks.Mock<global::DataContext> mock, string stateName, global::System.Action<global::TUnit.Mocks.Mock<global::DataContext>> configure)
=> global::TUnit.Mocks.Mock.InState(mock, stateName, configure);

extension(global::TUnit.Mocks.Mock<global::DataContext> mock)
{
[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public global::System.Collections.Generic.IReadOnlyList<global::TUnit.Mocks.Verification.CallRecord> Invocations => global::TUnit.Mocks.Mock.Invocations(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public global::TUnit.Mocks.MockBehavior Behavior => global::TUnit.Mocks.Mock.Behavior(mock);

[global::System.Runtime.CompilerServices.OverloadResolutionPriority(-1)]
public global::TUnit.Mocks.IDefaultValueProvider? DefaultValueProvider
{
get => global::TUnit.Mocks.Mock.GetDefaultValueProvider(mock);
set => global::TUnit.Mocks.Mock.SetDefaultValueProvider(mock, value);
}
}
#endif
}


// ===== FILE SEPARATOR =====

// <auto-generated/>
#pragma warning disable
#nullable enable

namespace TUnit.Mocks
{
public static class DataContext_MockStaticExtension
{
extension(global::DataContext _)
{
public static global::TUnit.Mocks.Mock<global::DataContext> Mock()
{
return global::TUnit.Mocks.Mock.Of<global::DataContext>();
}

public static global::TUnit.Mocks.Mock<global::DataContext> Mock(global::TUnit.Mocks.MockBehavior behavior)
{
return global::TUnit.Mocks.Mock.Of<global::DataContext>(behavior);
}
}
}
}


// ===== FILE SEPARATOR =====

// <auto-generated/>
#pragma warning disable
#nullable enable

namespace TUnit.Mocks.Generated;
Loading
Loading