65 lines
1.7 KiB
Rust
65 lines
1.7 KiB
Rust
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"));
|
|
}
|