fuel-vm 0.66.3

FuelVM interpreter.
Documentation
use alloc::{
    vec,
    vec::Vec,
};

use super::test_helpers;
use fuel_asm::*;
use fuel_tx::Receipt;
use fuel_types::Immediate24;
use fuel_vm::consts::{
    VM_MAX_RAM,
    VM_REGISTER_COUNT,
};
use test_helpers::{
    assert_panics,
    assert_success,
    run_script,
    set_full_word,
};

#[test]
fn all_registers_can_be_logged() {
    let mut script = Vec::new();
    for reg in 0..(VM_REGISTER_COUNT as u8) {
        script.push(op::movi(0x30, reg as Immediate24));
        script.push(op::log(0x30, reg, RegId::ZERO, RegId::ZERO));
    }
    script.push(op::ret(RegId::ONE));

    let receipts = run_script(script.into_iter().collect());
    assert_success(&receipts);

    let mut receipts_it = receipts.into_iter();
    for reg in 0..VM_REGISTER_COUNT {
        if let Receipt::Log { ra, .. } = receipts_it.next().expect("Missing receipt") {
            assert_eq!(ra, reg as u64);
        } else {
            unreachable!("Expected a log receipt");
        }
    }
}

#[test]
fn logd_memory_range_overflow() {
    let script = vec![
        op::not(0x30, RegId::ZERO),
        op::logd(RegId::ZERO, RegId::ZERO, 0x30, 1),
        op::ret(RegId::ONE),
    ];

    let receipts = run_script(script.into_iter().collect());
    assert_panics(&receipts, PanicReason::MemoryOverflow);
}

#[test]
fn logd_memory_out_of_range_fails() {
    let mut script = set_full_word(0x30, VM_MAX_RAM);
    script.push(op::logd(RegId::ZERO, RegId::ZERO, 0x30, 1));
    script.push(op::ret(RegId::ONE));

    let receipts = run_script(script.into_iter().collect());
    assert_panics(&receipts, PanicReason::MemoryOverflow);
}

#[test]
fn logd_just_below_memory_limit_succeeds() {
    let mut script = set_full_word(0x30, VM_MAX_RAM - 100);
    script.push(op::movi(0x31, 100));
    script.push(op::aloc(0x31));
    script.push(op::logd(RegId::ZERO, RegId::ZERO, 0x30, 0x31));
    script.push(op::ret(RegId::ONE));

    let receipts = run_script(script.into_iter().collect());
    assert_success(&receipts);
}