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
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<PackageVersion Include="NUnit3TestAdapter" Version="6.2.0" />
<PackageVersion Include="OpenTelemetry.Api" Version="1.15.3" />
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.15.3" />
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.0.0" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="10.0.8" />
<PackageVersion Include="System.Formats.Asn1" Version="10.0.8" />
<PackageVersion Include="TUnit" Version="1.46.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,17 @@ public void ApplicationInsightsGenerator_WhenDisabled_ExtensionMethodDoesNotExis
"WithApplicationInsights extension method should not exist when EnableMoqAutoMockerApplicationInsightsGenerator=false");
}

[Fact]
public void FakeTimeProviderGenerator_WhenDisabled_ExtensionMethodDoesNotExist()
{
// When EnableMoqAutoMockerFakeTimeProviderGenerator=false, the fake time provider
// extension methods should not be generated

bool hasGeneratedTimeProviderExtension = HasExtensionMethod("WithFakeTimeProvider");
Assert.False(hasGeneratedTimeProviderExtension,
"WithFakeTimeProvider extension method should not exist when EnableMoqAutoMockerFakeTimeProviderGenerator=false");
}

/// <summary>
/// Checks if an extension method with the given name exists for the AutoMocker type
/// in the current assembly (generated code is added to the consuming project).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
<EnableMoqAutoMockerKeyedServicesGenerator>false</EnableMoqAutoMockerKeyedServicesGenerator>
<EnableMoqAutoMockerFakeLoggingGenerator>false</EnableMoqAutoMockerFakeLoggingGenerator>
<EnableMoqAutoMockerApplicationInsightsGenerator>false</EnableMoqAutoMockerApplicationInsightsGenerator>
<EnableMoqAutoMockerFakeTimeProviderGenerator>false</EnableMoqAutoMockerFakeTimeProviderGenerator>
</PropertyGroup>

<ItemGroup>
Expand All @@ -20,6 +21,7 @@
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="Microsoft.ApplicationInsights" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
<PackageReference Include="xunit.v3" />
<PackageReference Include="xunit.runner.visualstudio">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down Expand Up @@ -56,6 +58,7 @@
<CompilerVisibleProperty Include="EnableMoqAutoMockerKeyedServicesGenerator" />
<CompilerVisibleProperty Include="EnableMoqAutoMockerFakeLoggingGenerator" />
<CompilerVisibleProperty Include="EnableMoqAutoMockerApplicationInsightsGenerator" />
<CompilerVisibleProperty Include="EnableMoqAutoMockerFakeTimeProviderGenerator" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Microsoft.Extensions.Time.Testing;

namespace Moq.AutoMock.Generator.Example.MSTest;

[TestClass]
public class ControllerWithTimeProviderTests
{
[TestMethod]
public void CreateInstance_WithFakeTimeProvider_CreatesController()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

Assert.IsNotNull(controller);
}

[TestMethod]
public void CreateInstance_WithFakeTimeProvider_UsesControlledTime()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

var fakeTimeProvider = mocker.Get<FakeTimeProvider>();
var startTime = new DateTimeOffset(2025, 1, 1, 12, 0, 0, TimeSpan.Zero);
fakeTimeProvider.SetUtcNow(startTime);

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

Assert.AreEqual(startTime, controller.GetCurrentTime());

fakeTimeProvider.Advance(TimeSpan.FromHours(1));

Assert.AreEqual(startTime.AddHours(1), controller.GetCurrentTime());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.Testing" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
<PackageReference Include="MSTest" />
<PackageReference Include="coverlet.collector">
<PrivateAssets>all</PrivateAssets>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Microsoft.Extensions.Time.Testing;
using NUnit.Framework;

namespace Moq.AutoMock.Generator.Example.NUnit;

public class ControllerWithTimeProviderTests
{
[Test]
public void CreateInstance_WithFakeTimeProvider_CreatesController()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

Assert.That(controller, Is.Not.Null);
}

[Test]
public void CreateInstance_WithFakeTimeProvider_UsesControlledTime()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

var fakeTimeProvider = mocker.Get<FakeTimeProvider>();
var startTime = new DateTimeOffset(2025, 1, 1, 12, 0, 0, TimeSpan.Zero);
fakeTimeProvider.SetUtcNow(startTime);

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

Assert.That(controller.GetCurrentTime(), Is.EqualTo(startTime));

fakeTimeProvider.Advance(TimeSpan.FromHours(1));

Assert.That(controller.GetCurrentTime(), Is.EqualTo(startTime.AddHours(1)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.Testing" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
<PackageReference Include="NUnit" />
<PackageReference Include="NUnit3TestAdapter" />
<PackageReference Include="coverlet.collector">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Microsoft.Extensions.Time.Testing;

namespace Moq.AutoMock.Generator.Example.TUnit;

public partial class ControllerWithTimeProviderTests
{
[Test]
public async Task CreateInstance_WithFakeTimeProvider_CreatesController()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

await Assert.That(controller).IsNotNull();
}

[Test]
public async Task CreateInstance_WithFakeTimeProvider_UsesControlledTime()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

var fakeTimeProvider = mocker.Get<FakeTimeProvider>();
var startTime = new DateTimeOffset(2025, 1, 1, 12, 0, 0, TimeSpan.Zero);
fakeTimeProvider.SetUtcNow(startTime);

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

await Assert.That(controller.GetCurrentTime()).IsEqualTo(startTime);

fakeTimeProvider.Advance(TimeSpan.FromHours(1));

await Assert.That(controller.GetCurrentTime()).IsEqualTo(startTime.AddHours(1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="TUnit" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.Testing" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Microsoft.Extensions.Time.Testing;
using Xunit;

namespace Moq.AutoMock.Generator.Example.xUnit;

public class ControllerWithTimeProviderTests
{
[Fact]
public void CreateInstance_WithFakeTimeProvider_CreatesController()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

Assert.NotNull(controller);
}

[Fact]
public void CreateInstance_WithFakeTimeProvider_UsesControlledTime()
{
AutoMocker mocker = new();

mocker.WithFakeTimeProvider();

var fakeTimeProvider = mocker.Get<FakeTimeProvider>();
var startTime = new DateTimeOffset(2025, 1, 1, 12, 0, 0, TimeSpan.Zero);
fakeTimeProvider.SetUtcNow(startTime);

ControllerWithTimeProvider controller = mocker.CreateInstance<ControllerWithTimeProvider>();

Assert.Equal(startTime, controller.GetCurrentTime());

fakeTimeProvider.Advance(TimeSpan.FromHours(1));

Assert.Equal(startTime.AddHours(1), controller.GetCurrentTime());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.Testing" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
<PackageReference Include="xunit.v3" />
<PackageReference Include="xunit.runner.visualstudio">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Moq.AutoMock.Generator.Example;

public class ControllerWithTimeProvider
{
private readonly TimeProvider _timeProvider;

public ControllerWithTimeProvider(TimeProvider timeProvider)
{
_timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider));
}

public DateTimeOffset GetCurrentTime() => _timeProvider.GetUtcNow();
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Options" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" />
</ItemGroup>

</Project>
1 change: 1 addition & 0 deletions Moq.AutoMock/build/Moq.AutoMock.props
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
<CompilerVisibleProperty Include="EnableMoqAutoMockerFakeLoggingGenerator" />
<CompilerVisibleProperty Include="EnableMoqAutoMockerApplicationInsightsGenerator" />
<CompilerVisibleProperty Include="EnableMoqAutoMockerMeterFactoryGenerator" />
<CompilerVisibleProperty Include="EnableMoqAutoMockerFakeTimeProviderGenerator" />
</ItemGroup>
</Project>
17 changes: 16 additions & 1 deletion Moq.AutoMocker.Generators.Tests/CSharpSourceGeneratorVerifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class Test : CSharpSourceGeneratorTest<EmptySourceGeneratorProvider, Defa
public bool ReferenceAutoMocker { get; set; } = true;
public bool ReferenceOptionsAbstractions { get; set; }
public bool ReferenceFakeLogging { get; set; }
public bool ReferenceFakeTimeProvider { get; set; }
public bool ReferenceApplicationInsights { get; set; }
public bool ReferenceOpenTelemetryInMemoryExporter { get; set; }
public bool ReferenceDependencyInjection { get; set; }
Expand Down Expand Up @@ -51,7 +52,7 @@ protected override IEnumerable<Type> GetSourceGenerators()
protected override Project ApplyCompilationOptions(Project project)
{
//project.AnalyzerOptions.WithAdditionalFiles();
if (ReferenceAutoMocker || ReferenceOptionsAbstractions || ReferenceFakeLogging || ReferenceApplicationInsights || ReferenceDependencyInjection || ReferenceOpenTelemetryInMemoryExporter || ReferenceDiagnosticSource)
if (ReferenceAutoMocker || ReferenceOptionsAbstractions || ReferenceFakeLogging || ReferenceFakeTimeProvider || ReferenceApplicationInsights || ReferenceDependencyInjection || ReferenceOpenTelemetryInMemoryExporter || ReferenceDiagnosticSource)
{
string fullPath = Path.GetFullPath($"{AutoMock.AssemblyName}.dll");
project = project.AddMetadataReference(MetadataReference.CreateFromFile(fullPath));
Expand Down Expand Up @@ -80,6 +81,20 @@ protected override Project ApplyCompilationOptions(Project project)
}
}

if (ReferenceFakeTimeProvider)
{
// Add reference to Microsoft.Extensions.TimeProvider.Testing
try
{
var fakeTimeProviderAssembly = typeof(Microsoft.Extensions.Time.Testing.FakeTimeProvider).Assembly;
project = project.AddMetadataReference(MetadataReference.CreateFromFile(fakeTimeProviderAssembly.Location));
}
catch
{
// If we can't find the assembly, the test will fail, which is appropriate
}
}

if (ReferenceApplicationInsights)
{
// Add reference to Microsoft.ApplicationInsights
Expand Down
Loading
Loading