extern crate alloc;
#[macro_use]
extern crate aluvm;
#[macro_use]
extern crate paste;
use aluvm::isa::Instr;
use aluvm::program::{Lib, Program};
use aluvm::Vm;
#[test]
fn a_eq_test() {
let code = aluasm! {
put 4,a16[1];
put 4,a16[2];
eq.n a16[1],a16[2];
ret;
};
run(code, true)
}
#[test]
fn a_eq_fail_test() {
let code = aluasm! {
put 3,a16[1];
put 4,a16[2];
eq.n a16[1],a16[2];
ret;
};
run(code, false)
}
#[test]
fn a_eq_noneeq_eq_test() {
let code = aluasm! {
eq.e a16[1],a16[2];
ret;
};
run(code, true)
}
#[test]
fn a_eq_noneeq_noneq_test() {
let code = aluasm! {
eq.n a16[1],a16[2];
ret;
};
run(code, false)
}
#[test]
fn a_gt_u_test() {
let code = aluasm! {
put 2,a8[1];
put 1,a8[2];
gt.u a8[1],a8[2];
ret;
};
run(code, true)
}
#[test]
fn a_gt_s_test() {
let code = aluasm! {
put 1,a8[1];
put 255,a8[2]; gt.s a8[1],a8[2];
ret;
};
run(code, true);
let code = aluasm! {
put 1,a8[1];
put -1,a8[2];
gt.s a8[1],a8[2];
ret;
};
run(code, true);
let code = aluasm! {
put 1,a8[1];
put 2,a8[2];
gt.s a8[1],a8[2];
ret;
};
run(code, false);
}
#[test]
fn a_lt_u_test() {
let code = aluasm! {
put 1,a8[1];
put 2,a8[2];
lt.u a8[1],a8[2];
ret;
};
run(code, true)
}
#[test]
fn a_lt_s_test() {
let code = aluasm! {
put 255,a8[1]; put 1,a8[2];
lt.s a8[1],a8[2];
ret;
};
run(code, true);
let code = aluasm! {
put -1,a8[1];
put 1,a8[2];
lt.s a8[1],a8[2];
ret;
};
run(code, true);
let code = aluasm! {
put 2,a8[1];
put 1,a8[2];
lt.s a8[1],a8[2];
ret;
};
run(code, false);
}
fn run(code: Vec<Instr>, expect_success: bool) {
let mut runtime = Vm::<Instr>::new();
let program = Program::<Instr>::new(Lib::assemble(&code).unwrap());
let res = runtime.run(&program);
println!("\nVM microprocessor core state:\n{:#?}", runtime.registers());
assert!(res == expect_success)
}