fix: 修复数组长度与槽位索引截断问题
This commit is contained in:
@@ -38,6 +38,21 @@ fn array_push_returns_true_length_beyond_31() {
|
||||
assert_eq!(result.as_int(), 32);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn array_length_tracks_more_than_31_elements() {
|
||||
let result = eval("var a=[]; for (var i=0;i<40;i=i+1) a.push(i); a.length").unwrap();
|
||||
assert_eq!(result.as_int(), 40);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn array_push_preserves_slots_beyond_255() {
|
||||
let result = eval("var a=[]; for (var i=0;i<257;i=i+1) a.push(i); a").unwrap();
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 257);
|
||||
let tail = obj.get_prop_at(256);
|
||||
assert_eq!(tail.as_double(), 256.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn array_pop_returns_last() {
|
||||
let result = eval("[1,2,3].pop()").unwrap();
|
||||
|
||||
@@ -16,11 +16,15 @@ fn eval(source: &str) -> Result<oxide_types::value::JsValue, String> {
|
||||
fn object_keys_empty() {
|
||||
let result = eval("Object.keys({})").unwrap();
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_keys_has_own_property() {
|
||||
eval("Object.keys({a:1})").unwrap();
|
||||
let result = eval("Object.keys({a:1,b:2})").unwrap();
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -68,10 +72,14 @@ fn object_has_own_true() {
|
||||
fn object_entries_returns_array() {
|
||||
let result = eval("Object.entries({a:1,b:2})").unwrap();
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_values_returns_array() {
|
||||
let result = eval("Object.values({a:1,b:2})").unwrap();
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 2);
|
||||
}
|
||||
|
||||
@@ -227,6 +227,9 @@ fn string_split_with_regexp() {
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "'a,b,c'.split(/,/)").unwrap();
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 3);
|
||||
assert_eq!(to_str(&vm, obj.get_prop_at(1)), "b");
|
||||
}
|
||||
|
||||
// --- toString ---
|
||||
|
||||
@@ -143,6 +143,10 @@ fn string_split_comma() {
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "'a,b,c'.split(',')").unwrap();
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 3);
|
||||
assert_eq!(to_str(&vm, obj.get_prop_at(0)), "a");
|
||||
assert_eq!(to_str(&vm, obj.get_prop_at(2)), "c");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -27,13 +27,7 @@ fn json_parse_object() {
|
||||
let result = eval(&mut vm, "JSON.parse('{\"a\":1,\"b\":2}')").unwrap();
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
let mut count = 0;
|
||||
for i in 0..obj.prop_vec_len() {
|
||||
if !obj.get_prop_at(i as u8).is_undefined() {
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
assert_eq!(count, 2);
|
||||
assert_eq!(obj.prop_count(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -43,7 +37,8 @@ fn json_parse_array() {
|
||||
assert!(result.is_object());
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert!(obj.is_array());
|
||||
assert_eq!(obj.prop_vec_len(), 3);
|
||||
assert_eq!(obj.prop_count(), 3);
|
||||
assert_eq!(obj.get_prop_at(2).as_double(), 3.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user