Skip to content

Commit f1dd732

Browse files
authored
feat: allow setting the used ITimeSystem (#824)
This PR adds the ability to configure a custom `ITimeSystem` when initializing a `MockFileSystem`, enhancing the testing capabilities by allowing developers to control time behavior in their tests. - Adds a new `UseTimeSystem()` method to `MockFileSystemOptions` for configuring custom time systems - Updates the `MockFileSystem` constructor to use the provided time system instead of always defaulting to current time
1 parent 92988f9 commit f1dd732

File tree

7 files changed

+36
-2
lines changed

7 files changed

+36
-2
lines changed

Source/Testably.Abstractions.Testing/MockFileSystem.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public MockFileSystem(Func<MockFileSystemOptions, MockFileSystemOptions> options
128128
using IDisposable release = FileSystemRegistration.Ignore();
129129
RandomSystem =
130130
new MockRandomSystem(initialization.RandomProvider ?? RandomProvider.Default());
131-
TimeSystem = new MockTimeSystem(TimeProvider.Now());
131+
TimeSystem = initialization.TimeSystem ?? new MockTimeSystem(TimeProvider.Now());
132132
_pathMock = new PathMock(this);
133133
_storage = new InMemoryStorage(this);
134134
ChangeHandler = new ChangeHandler(this);
@@ -275,6 +275,11 @@ public class MockFileSystemOptions
275275
/// </summary>
276276
internal IRandomProvider? RandomProvider { get; private set; }
277277

278+
/// <summary>
279+
/// The <see cref="ITimeSystem" /> to use within the <see cref="MockFileSystem" />.
280+
/// </summary>
281+
internal ITimeSystem? TimeSystem { get; private set; }
282+
278283
/// <summary>
279284
/// The simulated operating system.
280285
/// </summary>
@@ -317,5 +322,14 @@ public MockFileSystemOptions UseRandomProvider(IRandomProvider randomProvider)
317322
RandomProvider = randomProvider;
318323
return this;
319324
}
325+
326+
/// <summary>
327+
/// Use the given <paramref name="timeSystem" /> within the <see cref="MockFileSystem" />.
328+
/// </summary>
329+
public MockFileSystemOptions UseTimeSystem(ITimeSystem timeSystem)
330+
{
331+
TimeSystem = timeSystem;
332+
return this;
333+
}
320334
}
321335
}

Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net6.0.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ namespace Testably.Abstractions.Testing
125125
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory() { }
126126
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory(string path) { }
127127
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseRandomProvider(Testably.Abstractions.Testing.RandomSystem.IRandomProvider randomProvider) { }
128+
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseTimeSystem(Testably.Abstractions.ITimeSystem timeSystem) { }
128129
}
129130
}
130131
public static class MockFileSystemExtensions

Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net8.0.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ namespace Testably.Abstractions.Testing
125125
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory() { }
126126
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory(string path) { }
127127
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseRandomProvider(Testably.Abstractions.Testing.RandomSystem.IRandomProvider randomProvider) { }
128+
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseTimeSystem(Testably.Abstractions.ITimeSystem timeSystem) { }
128129
}
129130
}
130131
public static class MockFileSystemExtensions

Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_net9.0.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ namespace Testably.Abstractions.Testing
125125
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory() { }
126126
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory(string path) { }
127127
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseRandomProvider(Testably.Abstractions.Testing.RandomSystem.IRandomProvider randomProvider) { }
128+
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseTimeSystem(Testably.Abstractions.ITimeSystem timeSystem) { }
128129
}
129130
}
130131
public static class MockFileSystemExtensions

Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.0.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ namespace Testably.Abstractions.Testing
122122
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory() { }
123123
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory(string path) { }
124124
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseRandomProvider(Testably.Abstractions.Testing.RandomSystem.IRandomProvider randomProvider) { }
125+
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseTimeSystem(Testably.Abstractions.ITimeSystem timeSystem) { }
125126
}
126127
}
127128
public static class MockFileSystemExtensions

Tests/Api/Testably.Abstractions.Api.Tests/Expected/Testably.Abstractions.Testing_netstandard2.1.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ namespace Testably.Abstractions.Testing
122122
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory() { }
123123
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseCurrentDirectory(string path) { }
124124
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseRandomProvider(Testably.Abstractions.Testing.RandomSystem.IRandomProvider randomProvider) { }
125+
public Testably.Abstractions.Testing.MockFileSystem.MockFileSystemOptions UseTimeSystem(Testably.Abstractions.ITimeSystem timeSystem) { }
125126
}
126127
}
127128
public static class MockFileSystemExtensions

Tests/Testably.Abstractions.Testing.Tests/MockFileSystemInitializationTests.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public async Task UseCurrentDirectory_WithPath_ShouldUsePathCurrentDirectory(str
127127
[AutoData]
128128
public async Task UseRandomProvider_ShouldUseFixedRandomValue(int fixedRandomValue)
129129
{
130-
MockFileSystem fileSystem = new(i => i
130+
MockFileSystem fileSystem = new(options => options
131131
.UseRandomProvider(RandomProvider.Generate(
132132
intGenerator: new RandomProvider.Generator<int>(() => fixedRandomValue))));
133133

@@ -139,6 +139,21 @@ public async Task UseRandomProvider_ShouldUseFixedRandomValue(int fixedRandomVal
139139
await That(results).All().AreEqualTo(fixedRandomValue);
140140
}
141141

142+
[Theory]
143+
[AutoData]
144+
public async Task UseTimeSystem_ShouldUseProvidedTimeSystem(int offsetSeconds)
145+
{
146+
DateTime simulatedNow = DateTime.Now.AddSeconds(offsetSeconds);
147+
MockTimeSystem timeSystem = new(TimeProvider.Use(simulatedNow));
148+
MockFileSystem fileSystem = new(options => options
149+
.UseTimeSystem(timeSystem));
150+
151+
fileSystem.File.WriteAllText("foo", "some text");
152+
DateTime result = fileSystem.File.GetCreationTime("foo");
153+
154+
await That(result).IsEqualTo(simulatedNow);
155+
}
156+
142157
#region Helpers
143158

144159
#if CAN_SIMULATE_OTHER_OS

0 commit comments

Comments
 (0)