Phase 6: P-Code-Bibliotheken und Linker abschließen, Cross-Buildplan festhalten
This commit is contained in:
@@ -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}"
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user