|
@@ -1,5 +1,6 @@
|
|
|
using System.Globalization;
|
|
|
using Jint.Runtime;
|
|
|
+using Microsoft.Extensions.Time.Testing;
|
|
|
using NodaTime;
|
|
|
|
|
|
namespace Jint.Tests.PublicInterface;
|
|
@@ -33,6 +34,29 @@ public class TimeSystemTests
|
|
|
|
|
|
Assert.Equal(expected, engine.Evaluate($"new Date({input}) * 1").AsNumber());
|
|
|
}
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void CanUseTimeProvider()
|
|
|
+ {
|
|
|
+ var defaultEngine = new Engine();
|
|
|
+ var defaultNow = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
|
+ var defaultScriptNow = defaultEngine.Evaluate("new Date() * 1").AsNumber();
|
|
|
+ Assert.InRange(defaultScriptNow, defaultNow, defaultNow + 100);
|
|
|
+
|
|
|
+ var timeProvider = new FakeTimeProvider();
|
|
|
+ timeProvider.SetUtcNow(new DateTimeOffset(2023, 11, 6, 0, 0, 0, 0, TimeSpan.Zero));
|
|
|
+
|
|
|
+ var timeProviderEngine = new Engine(options =>
|
|
|
+ {
|
|
|
+ options.TimeSystem = new TimeProviderTimeSystem(timeProvider);
|
|
|
+ });
|
|
|
+
|
|
|
+ var timeProviderNow = timeProvider.GetUtcNow().ToUnixTimeMilliseconds();
|
|
|
+ var timeProviderScriptNow = timeProviderEngine.Evaluate("new Date() * 1").AsNumber();
|
|
|
+ Assert.InRange(timeProviderNow, timeProviderScriptNow, timeProviderScriptNow + 100);
|
|
|
+
|
|
|
+ Assert.NotInRange(timeProviderScriptNow, defaultScriptNow - 10000, defaultScriptNow + 10000);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
file sealed class NodaTimeSystem : DefaultTimeSystem
|
|
@@ -52,3 +76,18 @@ file sealed class NodaTimeSystem : DefaultTimeSystem
|
|
|
return offset.ToTimeSpan();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+file sealed class TimeProviderTimeSystem : DefaultTimeSystem
|
|
|
+{
|
|
|
+ private readonly TimeProvider _timeProvider;
|
|
|
+
|
|
|
+ public TimeProviderTimeSystem(TimeProvider timeProvider) : base(TimeZoneInfo.Utc, CultureInfo.CurrentCulture)
|
|
|
+ {
|
|
|
+ _timeProvider = timeProvider;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override DateTimeOffset GetUtcNow()
|
|
|
+ {
|
|
|
+ return _timeProvider.GetUtcNow();
|
|
|
+ }
|
|
|
+}
|