use crate::parser::NyashParser;

fn enable_stage3() {
    std::env::set_var("NYASH_FEATURES", "stage3");
}

#[test]
fn expr_postfix_catch_basic() {
    enable_stage3();
    let src = r#"
function main(args) {
  f(1) catch(e) { print(e) }
}
"#;
    let ast = NyashParser::parse_from_string(src).expect("parse ok");
    fn has_try(ast: &crate::ast::ASTNode) -> bool {
        match ast {
            crate::ast::ASTNode::TryCatch { .. } => true,
            crate::ast::ASTNode::Program { statements, .. } => statements.iter().any(has_try),
            crate::ast::ASTNode::FunctionDeclaration { body, .. } => body.iter().any(has_try),
            _ => false,
        }
    }
    assert!(has_try(&ast), "expected TryCatch from expr‑postfix catch");
}

#[test]
fn expr_postfix_catch_on_method_chain() {
    enable_stage3();
    let src = r#"
function main(args) {
  obj.m1().m2() catch { print("x") }
}
"#;
    let ast = NyashParser::parse_from_string(src).expect("parse ok");
    fn has_try(ast: &crate::ast::ASTNode) -> bool {
        match ast {
            crate::ast::ASTNode::TryCatch { .. } => true,
            crate::ast::ASTNode::Program { statements, .. } => statements.iter().any(has_try),
            crate::ast::ASTNode::FunctionDeclaration { body, .. } => body.iter().any(has_try),
            _ => false,
        }
    }
    assert!(has_try(&ast), "expected TryCatch wrapping method chain");
}
