feat: 添加 do while 与 for-in 语法编译与执行支持
This commit is contained in:
@@ -142,3 +142,129 @@ fn eval_control_flow_complex() {
|
||||
"8"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_do_while_body_executes_once() {
|
||||
assert_eq!(eval("var x = 0; do { x = 1; } while (false); x"), "1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_do_while_multi_iteration() {
|
||||
assert_eq!(eval("var i = 0; do { i = i + 1; } while (i < 3); i"), "3");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_do_while_break() {
|
||||
assert_eq!(
|
||||
eval("var i = 0; do { i = i + 1; if (i >= 3) break; } while (true); i"),
|
||||
"3"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_do_while_continue() {
|
||||
assert_eq!(
|
||||
eval("var i = 0; var r = 0; do { i = i + 1; if (i == 3) continue; r = r + 1; } while (i < 5); r"),
|
||||
"4"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_enumerates_keys() {
|
||||
assert_eq!(
|
||||
eval("var n=0; for (k in {a:1,b:2}) { n=n+1; } n"),
|
||||
"2"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_empty_object() {
|
||||
assert_eq!(eval("var r=0; for (k in {}) { r=1; } r"), "0");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_non_object_throws() {
|
||||
let result = eval("for (k in 42) {}");
|
||||
assert!(
|
||||
result.contains("TypeError"),
|
||||
"expected TypeError, got: {result}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_nested() {
|
||||
assert_eq!(
|
||||
eval("var r=0; for (k in {a:{x:1}}) { for (j in {y:2}) { r=r+1; } } r"),
|
||||
"1"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_break() {
|
||||
assert_eq!(
|
||||
eval("var r=0; for (k in {a:1,b:2,c:3}) { if (k=='b') break; r=r+1; } r"),
|
||||
"1"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_continue() {
|
||||
assert_eq!(
|
||||
eval("var r=0; for (k in {a:1,b:2}) { if (k=='a') continue; r=r+1; } r"),
|
||||
"1"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_for_in_let_scoping() {
|
||||
let result = eval("var r=0; for (let k in {a:1}) { r=1; } r");
|
||||
assert_eq!(result, "1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_switch_basic_match() {
|
||||
assert_eq!(
|
||||
eval("var x=0;switch(2){case 1:x=10;case 2:x=20;break;default:x=30;}x"),
|
||||
"20"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_switch_fallthrough() {
|
||||
assert_eq!(
|
||||
eval("var x=0;switch(1){case 1:case 2:x=42;}x"),
|
||||
"42"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_switch_default() {
|
||||
assert_eq!(
|
||||
eval("var x=0;switch(99){case 1:x=10;default:x=30;}x"),
|
||||
"30"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_switch_no_match_no_default() {
|
||||
assert_eq!(
|
||||
eval("var x=0;switch(99){case 1:x=10;}x"),
|
||||
"0"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_switch_break() {
|
||||
assert_eq!(
|
||||
eval("var x=0;switch(1){case 1:x=10;break;case 2:x=20;}x"),
|
||||
"10"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eval_break_in_switch_in_loop() {
|
||||
assert_eq!(
|
||||
eval("var r=0;while(true){switch(1){case 1:r=1;break;}r=2;break;}r"),
|
||||
"2"
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user