use fluxvm::vm::Interpreter;
#[test]
fn test_movi_halt() {
let bc = [0x2B, 0x00, 0x2A, 0x00, 0x80]; let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(0), 42);
}
#[test]
fn test_addition() {
let bc = [0x2B, 0x00, 0x0A, 0x00, 0x2B, 0x01, 0x14, 0x00, 0x08, 0x02, 0x00, 0x01, 0x80]; let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(2), 30);
}
#[test]
fn test_multiplication() {
let bc = [0x2B, 0x00, 0x06, 0x00, 0x2B, 0x01, 0x07, 0x00, 0x0A, 0x02, 0x00, 0x01, 0x80];
let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(2), 42);
}
#[test]
fn test_loop_sum() {
let bc = [0x2B, 0x00, 0x00, 0x00, 0x2B, 0x01, 0x0A, 0x00, 0x08, 0x00, 0x00, 0x01, 0x0F, 0x01, 0x06, 0x01, 0xF6, 0xFF, 0x80];
let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(0), 55);
}
#[test]
fn test_factorial() {
let bc = [0x2B, 0x03, 0x05, 0x00, 0x2B, 0x04, 0x01, 0x00, 0x0A, 0x04, 0x04, 0x03, 0x0F, 0x03, 0x06, 0x03, 0xF6, 0xFF, 0x80];
let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(4), 120);
}
#[test]
fn test_division_by_zero() {
let bc = [0x2B, 0x00, 0x0A, 0x00, 0x2B, 0x01, 0x00, 0x00, 0x0B, 0x02, 0x00, 0x01, 0x80];
let mut vm = Interpreter::new(&bc);
let result = vm.execute();
assert!(result.is_err());
}
#[test]
fn test_ishl() {
let bc = [0x2B, 0x00, 0x01, 0x00, 0x2B, 0x01, 0x04, 0x00, 0x14, 0x02, 0x00, 0x01, 0x80];
let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(2), 16);
}
#[test]
fn test_ishr() {
let bc = [0x2B, 0x00, 0x00, 0x01, 0x2B, 0x01, 0x03, 0x00, 0x15, 0x02, 0x00, 0x01, 0x80];
let mut vm = Interpreter::new(&bc);
vm.execute().unwrap();
assert_eq!(vm.read_gp(2), 32);
}