diff options
author | 2023-07-02 22:09:50 -0700 | |
---|---|---|
committer | 2023-07-02 22:09:50 -0700 | |
commit | aa38e51afb73dab3071addc07f82fd96153ff450 (patch) | |
tree | 086f4e8fe0d99adeef7aacf6afbe885f2c9a7663 /src/bun.js/bindings/JSMockFunction.cpp | |
parent | c21fadf9bcc939dcf7d949cda86c974481b5f609 (diff) | |
download | bun-aa38e51afb73dab3071addc07f82fd96153ff450.tar.gz bun-aa38e51afb73dab3071addc07f82fd96153ff450.tar.zst bun-aa38e51afb73dab3071addc07f82fd96153ff450.zip |
Support mocking `new Date()` & `Date.now()` in bun:test (#3501)
* Support changing the time
* Bump WebKit
* Update bun.lockb
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src/bun.js/bindings/JSMockFunction.cpp')
-rw-r--r-- | src/bun.js/bindings/JSMockFunction.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/bun.js/bindings/JSMockFunction.cpp b/src/bun.js/bindings/JSMockFunction.cpp index 33922c2b7..0e24e761c 100644 --- a/src/bun.js/bindings/JSMockFunction.cpp +++ b/src/bun.js/bindings/JSMockFunction.cpp @@ -19,6 +19,7 @@ #include <JavaScriptCore/WeakMapImpl.h> #include <JavaScriptCore/WeakMapImplInlines.h> #include <JavaScriptCore/FunctionPrototype.h> +#include <JavaScriptCore/DateInstance.h> namespace Bun { @@ -65,6 +66,29 @@ JSC_DECLARE_HOST_FUNCTION(jsMockFunctionMockRejectedValueOnce); JSC_DECLARE_HOST_FUNCTION(jsMockFunctionWithImplementationCleanup); JSC_DECLARE_HOST_FUNCTION(jsMockFunctionWithImplementation); +extern "C" EncodedJSValue JSMock__jsNow(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) +{ + return JSValue::encode(jsNumber(globalObject->jsDateNow())); +} +extern "C" EncodedJSValue JSMock__jsSetSystemTime(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) +{ + JSValue argument0 = callFrame->argument(0); + + if (auto* dateInstance = jsDynamicCast<DateInstance*>(argument0)) { + if (std::isnormal(dateInstance->internalNumber())) { + globalObject->overridenDateNow = dateInstance->internalNumber(); + } + return JSValue::encode(callFrame->thisValue()); + } + + if (argument0.isNumber() && argument0.asNumber() > 0) { + globalObject->overridenDateNow = argument0.asNumber(); + } + + globalObject->overridenDateNow = -1; + return JSValue::encode(callFrame->thisValue()); +} + uint64_t JSMockModule::s_nextInvocationId = 0; // This is taken from JSWeakSet |