fluxvm 0.1.0

FLUX bytecode runtime — Fluid Language Universal eXecution: a zero-dependency register-based VM with assembler, disassembler, A2A agent protocol, and vocabulary system
Documentation
use flux_core::bytecode::assembler::Assembler;
use flux_core::vm::Interpreter;

#[test]
fn test_assemble_movi_halt() {
    let bc = Assembler::assemble("MOVI R0, 42\nHALT").unwrap();
    assert_eq!(bc, vec![0x2B, 0x00, 0x2A, 0x00, 0x80]);
    let mut vm = Interpreter::new(&bc);
    vm.execute().unwrap();
    assert_eq!(vm.read_gp(0), 42);
}

#[test]
fn test_assemble_addition() {
    let source = "MOVI R0, 10\nMOVI R1, 20\nIADD R0, R1\nHALT";
    let bc = Assembler::assemble(source).unwrap();
    let mut vm = Interpreter::new(&bc);
    vm.execute().unwrap();
    assert_eq!(vm.read_gp(0), 30);
}

#[test]
fn test_assemble_loop() {
    let source = r#"
MOVI R0, 0
MOVI R1, 10
loop:
IADD R0, R1
DEC R1
JNZ R1, loop
HALT
"#;
    let bc = Assembler::assemble(source).unwrap();
    let mut vm = Interpreter::new(&bc);
    vm.execute().unwrap();
    assert_eq!(vm.read_gp(0), 55);
}

#[test]
fn test_assemble_factorial() {
    let source = r#"
MOVI R3, 5
MOVI R4, 1
loop:
IMUL R4, R3
DEC R3
JNZ R3, loop
HALT
"#;
    let bc = Assembler::assemble(source).unwrap();
    let mut vm = Interpreter::new(&bc);
    vm.execute().unwrap();
    assert_eq!(vm.read_gp(4), 120);
}