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)); }