51 lines
1.4 KiB
Rust
51 lines
1.4 KiB
Rust
use prometeu_compiler::compiler;
|
|
use prometeu_bytecode::pbc::parse_pbc;
|
|
use prometeu_bytecode::disasm::disasm;
|
|
use prometeu_bytecode::opcode::OpCode;
|
|
use std::fs;
|
|
use tempfile::tempdir;
|
|
|
|
#[test]
|
|
fn test_compile_hip_program() {
|
|
let dir = tempdir().unwrap();
|
|
let project_dir = dir.path();
|
|
|
|
// Create prometeu.json
|
|
fs::write(
|
|
project_dir.join("prometeu.json"),
|
|
r#"{
|
|
"script_fe": "pbs",
|
|
"entry": "main.pbs"
|
|
}"#,
|
|
).unwrap();
|
|
|
|
// Create main.pbs with HIP effects
|
|
let code = "
|
|
fn main() {
|
|
let x = alloc int;
|
|
mutate x as v {
|
|
let y = v + 1;
|
|
}
|
|
}
|
|
";
|
|
fs::write(project_dir.join("main.pbs"), code).unwrap();
|
|
|
|
// Compile
|
|
let unit = compiler::compile(project_dir).expect("Failed to compile");
|
|
|
|
// Parse PBC
|
|
let pbc = parse_pbc(&unit.rom).expect("Failed to parse PBC");
|
|
|
|
// Disassemble
|
|
let instrs = disasm(&pbc.rom).expect("Failed to disassemble");
|
|
|
|
// Verify opcodes exist in bytecode
|
|
let opcodes: Vec<_> = instrs.iter().map(|i| i.opcode).collect();
|
|
|
|
assert!(opcodes.contains(&OpCode::Alloc));
|
|
assert!(opcodes.contains(&OpCode::LoadRef)); // From ReadGate
|
|
assert!(opcodes.contains(&OpCode::StoreRef)); // From WriteGate
|
|
assert!(opcodes.contains(&OpCode::Add));
|
|
assert!(opcodes.contains(&OpCode::Ret));
|
|
}
|