miden-debug-engine 0.17.0

Core debugger engine for miden-debug
Documentation
use miden_assembly::{Assembler, DefaultSourceManager};
use miden_core::serde::Serializable;
use miden_mast_package::SectionId;

use super::*;

#[test]
fn current_package_with_debug_info_loads() {
    let package = Assembler::new(Arc::new(DefaultSourceManager::default()))
        .assemble_program("test", "begin push.1 drop end")
        .unwrap();

    let uri = Uri::new("current.masp");
    let restored = read_package_from_bytes(&package.to_bytes(), &uri).unwrap();

    assert_eq!(restored.to_bytes(), package.to_bytes());
    assert!(restored.debug_info().unwrap().is_some());
}

#[test]
fn incompatible_package_format_recommends_matching_toolchain() {
    let bytes = b"MASP\0\x06\x00\x00";

    let uri = Uri::new("old.masp");
    let report = read_package_from_bytes(bytes, &uri).unwrap_err();
    let error = report
        .downcast_ref::<PackageLoadError>()
        .expect("expected a classified package load error");

    let PackageLoadError::IncompatiblePackageFormat { version, help, .. } = error else {
        panic!("expected an incompatible package format error, got {error:?}");
    };
    assert_eq!(*version, PackageFormatVersion([6, 0, 0]));
    assert!(help.contains("miden +0.16.0 debug"));
}

#[test]
fn incompatible_debug_info_recommends_matching_toolchain() {
    let mut package = Assembler::new(Arc::new(DefaultSourceManager::default()))
        .assemble_program("test", "begin push.1 drop end")
        .unwrap();
    let debug_info = package
        .sections
        .iter_mut()
        .find(|section| section.id == SectionId::DEBUG_INFO)
        .expect("assembled package should contain debug info");
    debug_info.data.to_mut()[0] = u8::MAX;

    let uri = Uri::new("old-debug.masp");
    let report = read_package_from_bytes(&package.to_bytes(), &uri).unwrap_err();
    let error = report
        .downcast_ref::<PackageLoadError>()
        .expect("expected a classified package load error");

    let PackageLoadError::IncompatibleDebugInfoFormat { help, .. } = error else {
        panic!("expected an incompatible debug-info format error, got {error:?}");
    };
    assert!(help.contains("miden +0.16.0 debug"));
}

#[test]
fn malformed_package_does_not_get_a_version_hint() {
    let uri = Uri::new("broken.masp");
    let report = read_package_from_bytes(b"not a package", &uri).unwrap_err();
    let error = report
        .downcast_ref::<PackageLoadError>()
        .expect("expected a classified package load error");

    assert!(matches!(error, PackageLoadError::DecodePackage { .. }));
}