Skip to content
4 changes: 2 additions & 2 deletions TUnit.Mocks.Benchmarks/CallbackBenchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public int Mockolate_Callback()
{
var count = 0;
var svc = INotificationService.CreateMock();
svc.Mock.Setup.Send(Mockolate.It.IsAny<string>(), Mockolate.It.IsAny<string>())
((Mockolate.Mock.IMockForINotificationService)svc).Setup.Send(Mockolate.It.IsAny<string>(), Mockolate.It.IsAny<string>())
.Do(() => count++);

svc.Send("user@test.com", "Hello");
Expand Down Expand Up @@ -129,7 +129,7 @@ public string Mockolate_CallbackWithArgs()
{
var lastMessage = "";
var logger = ILogger.CreateMock();
logger.Mock.Setup.Log(Mockolate.It.IsAny<string>(), Mockolate.It.IsAny<string>())
((Mockolate.Mock.IMockForILogger)logger).Setup.Log(Mockolate.It.IsAny<string>(), Mockolate.It.IsAny<string>())
.Do((_, msg) => lastMessage = msg);

logger.Log("INFO", "Test message 1");
Expand Down
14 changes: 7 additions & 7 deletions TUnit.Mocks.Benchmarks/CombinedWorkflowBenchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ public void Mockolate_FullWorkflow()
var logger = ILogger.CreateMock();

// Setup
repo.Mock.Setup.GetById(1).Returns(new User { Id = 1, Name = "Alice", Email = "alice@test.com" });
repo.Mock.Setup.Exists(1).Returns(true);
logger.Mock.Setup.IsEnabled(Mockolate.It.IsAny<string>()).Returns(true);
((Mockolate.Mock.IMockForIUserRepository)repo).Setup.GetById(1).Returns(new User { Id = 1, Name = "Alice", Email = "alice@test.com" });
((Mockolate.Mock.IMockForIUserRepository)repo).Setup.Exists(1).Returns(true);
((Mockolate.Mock.IMockForILogger)logger).Setup.IsEnabled(Mockolate.It.IsAny<string>()).Returns(true);

// Invoke
var user = repo.GetById(1);
Expand All @@ -91,10 +91,10 @@ public void Mockolate_FullWorkflow()
repo.Save(new User { Id = 2, Name = "Bob" });

// Verify
repo.Mock.Verify.GetById(1).Once();
repo.Mock.Verify.Exists(1).Once();
repo.Mock.Verify.Save(Mockolate.It.IsAny<User>()).Once();
logger.Mock.Verify.Log(Mockolate.It.IsAny<string>(), Mockolate.It.IsAny<string>()).Once();
((Mockolate.Mock.IMockForIUserRepository)repo).Verify.GetById(1).Once();
((Mockolate.Mock.IMockForIUserRepository)repo).Verify.Exists(1).Once();
((Mockolate.Mock.IMockForIUserRepository)repo).Verify.Save(Mockolate.It.IsAny<User>()).Once();
((Mockolate.Mock.IMockForILogger)logger).Verify.Log(Mockolate.It.IsAny<string>(), Mockolate.It.IsAny<string>()).Once();
}

[Benchmark(Description = "Moq")]
Expand Down
4 changes: 2 additions & 2 deletions TUnit.Mocks.Benchmarks/InvocationBenchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public void Setup()

// Mockolate
_mockolateObject = ICalculatorService.CreateMock();
_mockolateObject.Mock.Setup.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Returns(42);
_mockolateObject.Mock.Setup.Format(Mockolate.It.IsAny<int>()).Returns("formatted");
((Mockolate.Mock.IMockForICalculatorService)_mockolateObject).Setup.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Returns(42);
((Mockolate.Mock.IMockForICalculatorService)_mockolateObject).Setup.Format(Mockolate.It.IsAny<int>()).Returns("formatted");

// Moq
_moqMock = new Moq.Mock<ICalculatorService>();
Expand Down
16 changes: 8 additions & 8 deletions TUnit.Mocks.Benchmarks/SetupBenchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ public object Imposter_Setup()
public object Mockolate_Setup()
{
var sut = ICalculatorService.CreateMock();
sut.Mock.Setup.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Returns(42);
sut.Mock.Setup.Format(Mockolate.It.IsAny<int>()).Returns("formatted");
sut.Mock.Setup.Divide(Mockolate.It.IsAny<double>(), Mockolate.It.IsAny<double>()).Returns(1.5);
((Mockolate.Mock.IMockForICalculatorService)sut).Setup.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Returns(42);
((Mockolate.Mock.IMockForICalculatorService)sut).Setup.Format(Mockolate.It.IsAny<int>()).Returns("formatted");
((Mockolate.Mock.IMockForICalculatorService)sut).Setup.Divide(Mockolate.It.IsAny<double>(), Mockolate.It.IsAny<double>()).Returns(1.5);
return sut;
}

Expand Down Expand Up @@ -101,11 +101,11 @@ public object Imposter_MultipleSetups()
public object Mockolate_MultipleSetups()
{
var sut = IUserRepository.CreateMock();
sut.Mock.Setup.GetById(1).Returns(new User { Id = 1, Name = "Alice" });
sut.Mock.Setup.GetById(2).Returns(new User { Id = 2, Name = "Bob" });
sut.Mock.Setup.GetById(3).Returns(new User { Id = 3, Name = "Charlie" });
sut.Mock.Setup.Exists(Mockolate.It.IsAny<int>()).Returns(true);
sut.Mock.Setup.GetAll().Returns(new List<User>());
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.GetById(1).Returns(new User { Id = 1, Name = "Alice" });
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.GetById(2).Returns(new User { Id = 2, Name = "Bob" });
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.GetById(3).Returns(new User { Id = 3, Name = "Charlie" });
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.Exists(Mockolate.It.IsAny<int>()).Returns(true);
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.GetAll().Returns(new List<User>());
return sut;
}

Expand Down
16 changes: 8 additions & 8 deletions TUnit.Mocks.Benchmarks/VerificationBenchmarks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ public void Imposter_Verify()
public void Mockolate_Verify()
{
var sut = ICalculatorService.CreateMock();
sut.Mock.Setup.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Returns(42);
((Mockolate.Mock.IMockForICalculatorService)sut).Setup.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Returns(42);
sut.Add(1, 2);
sut.Add(3, 4);

sut.Mock.Verify.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Exactly(2);
((Mockolate.Mock.IMockForICalculatorService)sut).Verify.Add(Mockolate.It.IsAny<int>(), Mockolate.It.IsAny<int>()).Exactly(2);
}

[Benchmark(Description = "Moq")]
Expand Down Expand Up @@ -102,7 +102,7 @@ public void Imposter_VerifyNever()
public void Mockolate_VerifyNever()
{
var sut = ICalculatorService.CreateMock();
sut.Mock.Verify.Format(Mockolate.It.IsAny<int>()).Never();
((Mockolate.Mock.IMockForICalculatorService)sut).Verify.Format(Mockolate.It.IsAny<int>()).Never();
}

[Benchmark(Description = "Moq (Never)")]
Expand Down Expand Up @@ -166,17 +166,17 @@ public void Imposter_VerifyMultiple()
public void Mockolate_VerifyMultiple()
{
var sut = IUserRepository.CreateMock();
sut.Mock.Setup.GetById(Mockolate.It.IsAny<int>()).Returns(new User { Id = 1, Name = "Test" });
sut.Mock.Setup.Exists(Mockolate.It.IsAny<int>()).Returns(true);
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.GetById(Mockolate.It.IsAny<int>()).Returns(new User { Id = 1, Name = "Test" });
((Mockolate.Mock.IMockForIUserRepository)sut).Setup.Exists(Mockolate.It.IsAny<int>()).Returns(true);

sut.GetById(1);
sut.GetById(2);
sut.Exists(1);
sut.Save(new User { Id = 3, Name = "New" });

sut.Mock.Verify.GetById(Mockolate.It.IsAny<int>()).Exactly(2);
sut.Mock.Verify.Exists(Mockolate.It.IsAny<int>()).Once();
sut.Mock.Verify.Save(Mockolate.It.IsAny<User>()).Once();
((Mockolate.Mock.IMockForIUserRepository)sut).Verify.GetById(Mockolate.It.IsAny<int>()).Exactly(2);
((Mockolate.Mock.IMockForIUserRepository)sut).Verify.Exists(Mockolate.It.IsAny<int>()).Once();
((Mockolate.Mock.IMockForIUserRepository)sut).Verify.Save(Mockolate.It.IsAny<User>()).Once();
}

[Benchmark(Description = "Moq (Multiple)")]
Expand Down
49 changes: 49 additions & 0 deletions TUnit.Mocks.SourceGenerator.Tests/MockGeneratorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -628,4 +628,53 @@ public virtual void DoWork() { }

return VerifyGeneratorOutput(source);
}

[Test]
public Task Static_Extension_Discovery_Without_Mock_Of()
{
// IFoo.Mock() should trigger generation even without Mock.Of<IFoo>()
var source = """
using TUnit.Mocks;

public interface INotifier
{
void Notify(string message);
string GetStatus();
}

public class TestUsage
{
void M()
{
var mock = INotifier.Mock();
}
}
""";

return VerifyGeneratorOutput(source);
}

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

public interface IRepository<T>
{
T GetById(int id);
void Save(T entity);
}

public class TestUsage
{
void M()
{
var mock = IRepository<string>.Mock();
}
}
""";

return VerifyGeneratorOutput(source);
}
}
Loading
Loading