Skip to content

Commit 1b5ee0d

Browse files
author
Ralph Küpper
committed
fix(runtime): mock declared prototype methods
1 parent 504e180 commit 1b5ee0d

3 files changed

Lines changed: 23 additions & 3 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
`node:test`'s `mock.method()` now replaces declared class prototype methods for instance dispatch and restores their original behavior, while recording calls and receiver identity like Node.

crates/perry-runtime/src/node_submodules/test.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,22 @@ fn set_property_value(target: f64, property: &str, value: f64) {
367367
}
368368
}
369369

370+
fn set_method_property_value(target: f64, property: &str, value: f64) {
371+
let raw = raw_ptr_from_value(target);
372+
if let Some(class_id) = crate::object::class_id_for_decl_prototype_object(raw) {
373+
unsafe {
374+
crate::object::js_register_prototype_method(
375+
class_id,
376+
property.as_ptr(),
377+
property.len(),
378+
value,
379+
);
380+
}
381+
} else {
382+
set_property_value(target, property, value);
383+
}
384+
}
385+
370386
fn get_property_value(target: f64, property: &str) -> f64 {
371387
let raw = raw_ptr_from_value(target);
372388
if raw >= 0x10000 && crate::closure::is_closure_ptr(raw) {
@@ -691,7 +707,7 @@ fn restore_mock_state(id: i64) {
691707
target,
692708
property,
693709
original,
694-
}) => set_property_value(target, &property, original),
710+
}) => set_method_property_value(target, &property, original),
695711
Some(MockRestoreTarget::ObjectAccessor {
696712
target,
697713
property,
@@ -1036,7 +1052,7 @@ extern "C" fn mock_method_thunk(
10361052
original,
10371053
},
10381054
);
1039-
set_property_value(target.get_nanbox_f64(), &property_name, function);
1055+
set_method_property_value(target.get_nanbox_f64(), &property_name, function);
10401056
function
10411057
}
10421058

test-parity/node-suite/test/mock-fn/prototype-method.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { mock } from "node:test";
22

33
class Counter {
4-
constructor(public value: number) {}
4+
value: number;
5+
constructor(value: number) {
6+
this.value = value;
7+
}
58
read() {
69
return this.value;
710
}

0 commit comments

Comments
 (0)