Phase 6: P-Code-Bibliotheken und Linker abschließen, Cross-Buildplan festhalten

This commit is contained in:
2026-09-07 16:06:23 +02:00
parent 60d37ec79d
commit 25176947ba
33 changed files with 2416 additions and 203 deletions

View File

@@ -191,3 +191,107 @@ fn case_insensitive_parent_lookup_works_from_relative_base_without_changing_cwd(
let found = tb_vm::project_io::relative_case_insensitive(&base, "../SIBLING.BAS").unwrap();
assert_eq!(identity(&found).unwrap(), identity(&sibling).unwrap());
}
#[test]
fn tbl_members_move_save_as_order_startup_and_same_size_cache_replacement() {
use tb_frontend::{forms::FormCatalog, source::SourceUnit};
use tb_vm::{
interp::{RunEvent, Vm},
project::ProjectCompiler,
};
let t = Temp::new();
let library = |n, value| {
ProjectCompiler::default()
.compile_library(
&[SourceUnit::new(
"LIB",
"removed.bas",
&format!("CONST N={n}\nSUB Work\nPRINT {value}\nEND SUB\nPRINT \"LIB\""),
)],
&FormCatalog::default(),
&[],
&[],
)
.unwrap()
.to_tbl()
.unwrap()
};
let first = library(1, 1);
let second = library(2, 2);
assert_eq!(first.len(), second.len());
t.write("old/main.bas", "PRINT N\nCALL Work\n");
t.write("old/last.bas", "PRINT \"LAST\"\n");
let lib = t.0.join("old/Mixed.tbl");
fs::write(&lib, &first).unwrap();
let mak = t.write(
"old/app.mak",
"mixed.TBL\nlast.bas\nmain.bas\n' $STARTUP: \"main.bas\"\n",
);
let loader = SourceLoader::default();
let input = loader.load(&mak).unwrap();
assert_eq!(input.units.len(), 2);
assert_eq!(input.libraries.len(), 1);
let run = |code| {
let mut vm = Vm::new(code);
assert_eq!(
vm.run(&mut tb_runtime::host::CaptureHost::default()),
RunEvent::Ended
);
tb_runtime::snapshot::text(&vm.rt.screen)
};
let mut c = ProjectCompiler::default();
assert_eq!(
run(input.compile(&mut c, "APP").unwrap()),
" 1 \n 1 \nLIB\nLAST\n"
);
fs::write(&lib, &second).unwrap();
assert_eq!(
run(input.compile(&mut c, "APP").unwrap()),
" 2 \n 2 \nLIB\nLAST\n"
);
let body_only = library(2, 3);
assert_eq!(second.len(), body_only.len());
fs::write(&lib, &body_only).unwrap();
assert_eq!(
run(input.compile(&mut c, "APP").unwrap()),
" 2 \n 3 \nLIB\nLAST\n"
);
assert_eq!(
c.stats.compiled, 0,
"Unveränderte Deklarationen dürfen Quellprodukte wiederverwenden"
);
fs::create_dir_all(t.0.join("save")).unwrap();
let saved = t.0.join("save/app.mak");
fs::write(&saved, input.manifest.text(&saved).unwrap()).unwrap();
assert_eq!(
identity(&loader.load(&saved).unwrap().libraries[0]).unwrap(),
identity(&input.libraries[0]).unwrap()
);
fs::rename(t.0.join("old"), t.0.join("moved")).unwrap();
assert_eq!(
run(loader
.load(&t.0.join("moved/app.mak"))
.unwrap()
.compile(&mut c, "APP")
.unwrap()),
" 2 \n 3 \nLIB\nLAST\n"
);
let moved = t.0.join("moved/app.mak");
for text in [
"Mixed.tbl\n' $STARTUP: \"Mixed.tbl\"",
"Mixed.tbl\nmixed.TBL\n",
"absent.tbl\n",
] {
assert!(Manifest::parse(&moved, text, &loader).is_err(), "{text}");
}
assert!(
tb_vm::project_io::read_document(&t.0.join("moved/Mixed.tbl"))
.unwrap_err()
.contains("kein Textdokument")
);
fs::remove_file(t.0.join("moved/Mixed.tbl")).unwrap();
let error = loader.load(&moved).unwrap_err();
assert!(
error.contains("app.mak") && error.contains("mixed.TBL"),
"{error}"
);
}