use beamr::atom::AtomTable;
use beamr::loader::load_beam_chunks;
#[test]
fn all_otp_fixtures_load_without_errors() {
let fixtures_dir =
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/otp");
let expected_files = [
"gleam_erlang_ffi.beam",
"gleam_otp_external.beam",
"gleam@erlang@process.beam",
"gleam@otp@actor.beam",
"gleam@otp@supervisor.beam",
];
let atom_table = AtomTable::with_common_atoms();
let mut loaded_count = 0;
for filename in &expected_files {
let path = fixtures_dir.join(filename);
let bytes = std::fs::read(&path).unwrap_or_else(|err| {
panic!("failed to read fixture {filename}: {err}");
});
let parsed = load_beam_chunks(&bytes, &atom_table).unwrap_or_else(|err| {
panic!("failed to load fixture {filename}: {err}");
});
assert!(
!parsed.atoms.is_empty(),
"{filename}: atom table should not be empty"
);
assert!(
!parsed.instructions.is_empty(),
"{filename}: code section should not be empty"
);
loaded_count += 1;
}
assert_eq!(
loaded_count,
expected_files.len(),
"all fixture files should have been loaded"
);
}
#[test]
fn gleam_otp_actor_has_export_ext_literals() {
let path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("tests/fixtures/otp/gleam@otp@actor.beam");
let bytes = std::fs::read(&path).expect("fixture should be readable");
let atom_table = AtomTable::with_common_atoms();
let parsed = load_beam_chunks(&bytes, &atom_table).expect("actor module should load");
assert!(
!parsed.literals.is_empty(),
"gleam@otp@actor should have literals including EXPORT_EXT terms"
);
}