feat: 支持访问器描述符与 get/set 语法
This commit is contained in:
@@ -55,6 +55,48 @@ fn object_define_property_sets_value() {
|
||||
assert!(result.is_object());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_define_property_data_defaults_non_writable() {
|
||||
let (_vm, result) =
|
||||
eval("var o={}; Object.defineProperty(o,'x',{value:1}); Object.getOwnPropertyDescriptor(o,'x').writable")
|
||||
.unwrap();
|
||||
assert_eq!(result, JsValue::bool(false));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_define_property_accessor_descriptor_gets() {
|
||||
let (_vm, result) = eval(
|
||||
"var o={}; Object.defineProperty(o,'x',{get:function(){return 7}, enumerable:true, configurable:true}); o.x",
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(result, JsValue::int(7));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_define_property_rejects_mixed_descriptor() {
|
||||
let err = match eval("var o={}; Object.defineProperty(o,'x',{value:1,get:function(){return 2}})") {
|
||||
Ok(_) => panic!("expected mixed descriptor to fail"),
|
||||
Err(err) => err,
|
||||
};
|
||||
assert!(err.contains("TypeError"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_define_property_non_writable_assignment_throws() {
|
||||
let err = match eval("var o={}; Object.defineProperty(o,'x',{value:1}); o.x=2") {
|
||||
Ok(_) => panic!("expected assignment to fail"),
|
||||
Err(err) => err,
|
||||
};
|
||||
assert!(err.contains("TypeError"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_get_own_property_descriptor_accessor_shape() {
|
||||
let (_vm, result) =
|
||||
eval("var o={}; Object.defineProperty(o,'x',{get:function(){return 1}, configurable:true}); Object.getOwnPropertyDescriptor(o,'x').value").unwrap();
|
||||
assert!(result.is_undefined());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_get_prototype_of() {
|
||||
let (_vm, result) = eval("Object.getPrototypeOf({})").unwrap();
|
||||
|
||||
@@ -29,6 +29,27 @@ fn class_method_is_on_prototype() {
|
||||
assert_eq!(result.as_int(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn class_instance_getter_returns_value() {
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "class A { get x() { return 2; } } new A().x").unwrap();
|
||||
assert_eq!(result.as_int(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn class_instance_setter_updates_receiver() {
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "class A { set x(v) { this.y = v; } } var a = new A(); a.x = 4; a.y").unwrap();
|
||||
assert_eq!(result.as_int(), 4);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn class_static_getter_returns_value() {
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "class A { static get x() { return 5; } } A.x").unwrap();
|
||||
assert_eq!(result.as_int(), 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn class_constructor_initializes_instance_state() {
|
||||
let mut vm = Vm::new();
|
||||
|
||||
@@ -137,3 +137,18 @@ fn eval_numeric_property_key_compound_update() {
|
||||
fn eval_in_operator_coerces_numeric_key() {
|
||||
assert_eq!(eval("var o={}; o[1]=42; 1 in o"), "true");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_literal_getter_returns_value() {
|
||||
assert_eq!(eval("var o={ get x(){ return 7 } }; o.x"), "7");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_literal_setter_updates_receiver() {
|
||||
assert_eq!(eval("var o={ set x(v){ this.y=v } }; o.x=4; o.y"), "4");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_literal_getter_setter_pair() {
|
||||
assert_eq!(eval("var o={ get x(){ return this.y }, set x(v){ this.y=v } }; o.x=9; o.x"), "9");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user