use prometeu_compiler::frontends::pbs::PbsFrontend; use prometeu_compiler::frontends::Frontend; use prometeu_compiler::common::files::FileManager; use std::fs; use tempfile::tempdir; fn get_diagnostics(code: &str) -> String { let mut file_manager = FileManager::new(); let temp_dir = tempdir().unwrap(); let file_path = temp_dir.path().join("main.pbs"); fs::write(&file_path, code).unwrap(); let frontend = PbsFrontend; match frontend.compile_to_ir(&file_path, &mut file_manager) { Ok(_) => "[]".to_string(), Err(bundle) => bundle.to_json(&file_manager), } } #[test] fn test_golden_parse_error() { let code = "fn main() { let x = ; }"; let json = get_diagnostics(code); println!("{}", json); assert!(json.contains("E_PARSE_UNEXPECTED_TOKEN")); assert!(json.contains("Expected expression")); } #[test] fn test_golden_lex_error() { let code = "fn main() { let x = \"hello ; }"; let json = get_diagnostics(code); println!("{}", json); assert!(json.contains("E_LEX_UNTERMINATED_STRING")); } #[test] fn test_golden_resolve_error() { let code = "fn main() { let x = undefined_var; }"; let json = get_diagnostics(code); println!("{}", json); assert!(json.contains("E_RESOLVE_UNDEFINED")); } #[test] fn test_golden_type_error() { let code = "fn main() { let x: int = \"hello\"; }"; let json = get_diagnostics(code); println!("{}", json); assert!(json.contains("E_TYPE_MISMATCH")); } #[test] fn test_golden_namespace_collision() { let code = " declare struct Foo {} fn main() { let Foo = 1; } "; let json = get_diagnostics(code); println!("{}", json); assert!(json.contains("E_RESOLVE_NAMESPACE_COLLISION")); }