Implement Phase 5: Control flow & exceptions in MIR/VM - Core functionality complete
Co-authored-by: moe-charm <217100418+moe-charm@users.noreply.github.com>
This commit is contained in:
@ -110,4 +110,97 @@ mod tests {
|
||||
assert!(!mir_dump.is_empty(), "MIR dump should not be empty");
|
||||
assert!(mir_dump.contains("function"), "MIR dump should contain function information");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_throw_compilation() {
|
||||
let mut compiler = MirCompiler::new();
|
||||
|
||||
let throw_ast = ASTNode::Throw {
|
||||
expression: Box::new(ASTNode::Literal {
|
||||
value: LiteralValue::String("Test exception".to_string()),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}),
|
||||
span: crate::ast::Span::unknown(),
|
||||
};
|
||||
|
||||
let result = compiler.compile(throw_ast);
|
||||
assert!(result.is_ok(), "Throw compilation should succeed");
|
||||
|
||||
let compile_result = result.unwrap();
|
||||
let mir_dump = compiler.dump_mir(&compile_result.module);
|
||||
assert!(mir_dump.contains("throw"), "MIR should contain throw instruction");
|
||||
assert!(mir_dump.contains("safepoint"), "MIR should contain safepoint instruction");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_loop_compilation() {
|
||||
let mut compiler = MirCompiler::new();
|
||||
|
||||
let loop_ast = ASTNode::Loop {
|
||||
condition: Box::new(ASTNode::Literal {
|
||||
value: LiteralValue::Bool(true),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}),
|
||||
body: vec![
|
||||
ASTNode::Print {
|
||||
expression: Box::new(ASTNode::Literal {
|
||||
value: LiteralValue::String("Loop body".to_string()),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}
|
||||
],
|
||||
span: crate::ast::Span::unknown(),
|
||||
};
|
||||
|
||||
let result = compiler.compile(loop_ast);
|
||||
assert!(result.is_ok(), "Loop compilation should succeed");
|
||||
|
||||
let compile_result = result.unwrap();
|
||||
let mir_dump = compiler.dump_mir(&compile_result.module);
|
||||
assert!(mir_dump.contains("br"), "MIR should contain branch instructions");
|
||||
assert!(mir_dump.contains("safepoint"), "MIR should contain safepoint instructions");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_try_catch_compilation() {
|
||||
let mut compiler = MirCompiler::new();
|
||||
|
||||
let try_catch_ast = ASTNode::TryCatch {
|
||||
try_body: vec![
|
||||
ASTNode::Print {
|
||||
expression: Box::new(ASTNode::Literal {
|
||||
value: LiteralValue::String("Try block".to_string()),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}
|
||||
],
|
||||
catch_clauses: vec![
|
||||
crate::ast::CatchClause {
|
||||
exception_type: Some("Exception".to_string()),
|
||||
variable_name: Some("e".to_string()),
|
||||
body: vec![
|
||||
ASTNode::Print {
|
||||
expression: Box::new(ASTNode::Literal {
|
||||
value: LiteralValue::String("Catch block".to_string()),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}),
|
||||
span: crate::ast::Span::unknown(),
|
||||
}
|
||||
],
|
||||
span: crate::ast::Span::unknown(),
|
||||
}
|
||||
],
|
||||
finally_body: None,
|
||||
span: crate::ast::Span::unknown(),
|
||||
};
|
||||
|
||||
let result = compiler.compile(try_catch_ast);
|
||||
assert!(result.is_ok(), "TryCatch compilation should succeed");
|
||||
|
||||
let compile_result = result.unwrap();
|
||||
let mir_dump = compiler.dump_mir(&compile_result.module);
|
||||
assert!(mir_dump.contains("catch"), "MIR should contain catch instruction");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user