Projektmodule und vollständiges TBC-Kompilat umsetzen und Change archivieren
This commit is contained in:
130
crates/tb-cli/tests/project.rs
Normal file
130
crates/tb-cli/tests/project.rs
Normal file
@@ -0,0 +1,130 @@
|
||||
use std::{
|
||||
path::Path,
|
||||
process::{Command, Output, Stdio},
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
fn tbc(dir: &Path, command: &str, file: &str) -> Output {
|
||||
let mut child = Command::new(env!("CARGO_BIN_EXE_tbc"))
|
||||
.current_dir(dir)
|
||||
.args([command, file])
|
||||
.stdin(Stdio::null())
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::piped())
|
||||
.spawn()
|
||||
.unwrap();
|
||||
let start = Instant::now();
|
||||
while child.try_wait().unwrap().is_none() {
|
||||
if start.elapsed() > Duration::from_secs(10) {
|
||||
child.kill().unwrap();
|
||||
child.wait().unwrap();
|
||||
panic!("tbc {command} {file}: Frist überschritten");
|
||||
}
|
||||
std::thread::sleep(Duration::from_millis(10));
|
||||
}
|
||||
child.wait_with_output().unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn projekt_und_formular_laufen_nach_entfernen_saemtlicher_quellen() {
|
||||
let dir = std::env::temp_dir().join(format!("tb-tbc-v4-{}", std::process::id()));
|
||||
std::fs::create_dir_all(&dir).unwrap();
|
||||
std::fs::write(dir.join("main.bas"), "a$=Form1!Text1.Text\nb$=Form1!Text1(2).Text\nForm1.Hide\nCLS\nPRINT a$\nPRINT b$\nCALL Ausgabe\nEND\n").unwrap();
|
||||
std::fs::write(
|
||||
dir.join("lib.bas"),
|
||||
"'$INCLUDE: 'outer.bi'\nSUB Ausgabe\nPRINT N\nEND SUB\n",
|
||||
)
|
||||
.unwrap();
|
||||
std::fs::write(dir.join("outer.bi"), "'$INCLUDE: 'inner.bi'\n").unwrap();
|
||||
std::fs::write(dir.join("inner.bi"), "CONST N=7\n").unwrap();
|
||||
std::fs::write(dir.join("form.frm"), "VERSION 1.00\nBEGIN Form Form1\n BEGIN TextBox Text1\n Index = 0\n Text = \"hello\"\n END\n BEGIN TextBox Text1\n Index = 2\n Text = \"world\"\n END\nEND\n").unwrap();
|
||||
std::fs::write(
|
||||
dir.join("app.mak"),
|
||||
"' Projekt\nMAIN.BAS\nLIB.BAS\nFORM.FRM\n",
|
||||
)
|
||||
.unwrap();
|
||||
let before = tbc(&dir, "run", "app.mak");
|
||||
assert!(before.status.success(), "{before:?}");
|
||||
assert_eq!(
|
||||
String::from_utf8_lossy(&before.stdout),
|
||||
"hello\nworld\n 7 \n"
|
||||
);
|
||||
let build = tbc(&dir, "build", "app.mak");
|
||||
assert!(build.status.success(), "{build:?}");
|
||||
let bytes = std::fs::read(dir.join("app.tbc")).unwrap();
|
||||
assert_eq!(&bytes[..6], b"TBC\0\x04\0");
|
||||
for file in [
|
||||
"main.bas", "lib.bas", "outer.bi", "inner.bi", "form.frm", "app.mak",
|
||||
] {
|
||||
std::fs::remove_file(dir.join(file)).unwrap();
|
||||
}
|
||||
let after = tbc(&dir, "run", "app.tbc");
|
||||
assert!(after.status.success(), "{after:?}");
|
||||
assert_eq!(after.stdout, before.stdout);
|
||||
for version in [1u16, 2, 3, 5, 32767] {
|
||||
let mut invalid = bytes.clone();
|
||||
invalid[4..6].copy_from_slice(&version.to_le_bytes());
|
||||
std::fs::write(dir.join("old.tbc"), invalid).unwrap();
|
||||
let out = tbc(&dir, "run", "old.tbc");
|
||||
assert!(!out.status.success());
|
||||
assert!(
|
||||
String::from_utf8_lossy(&out.stderr).contains(&format!("Formatversion {version}")),
|
||||
"{out:?}"
|
||||
);
|
||||
}
|
||||
std::fs::remove_dir_all(dir).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cli_meldet_physische_quellorte_auch_nach_verschachtelten_includes() {
|
||||
let dir = std::env::temp_dir().join(format!("tb-project-origins-{}", std::process::id()));
|
||||
std::fs::create_dir_all(&dir).unwrap();
|
||||
std::fs::write(dir.join("main.bas"), "CALL Fehler\nEND\n").unwrap();
|
||||
std::fs::write(dir.join("lib.bas"), "SUB Fehler\n200 ERROR 6\nEND SUB\n").unwrap();
|
||||
std::fs::write(dir.join("app.mak"), "main.bas\nlib.bas\n").unwrap();
|
||||
let out = tbc(&dir, "run", "app.mak");
|
||||
assert_eq!(out.status.code(), Some(2));
|
||||
assert!(
|
||||
String::from_utf8_lossy(&out.stderr).contains("lib.bas:2:5:"),
|
||||
"{out:?}"
|
||||
);
|
||||
std::fs::write(dir.join("lib.bas"), "SUB Fehler\ns$=42\nEND SUB\n").unwrap();
|
||||
let out = tbc(&dir, "check", "app.mak");
|
||||
assert!(!out.status.success());
|
||||
assert!(
|
||||
String::from_utf8_lossy(&out.stderr).contains("lib.bas:2:1:"),
|
||||
"{out:?}"
|
||||
);
|
||||
std::fs::write(dir.join("lib.bas"), "'$INCLUDE: 'outer.bi'\n").unwrap();
|
||||
std::fs::write(dir.join("outer.bi"), "'$INCLUDE: 'inner.bi'\n").unwrap();
|
||||
std::fs::write(dir.join("inner.bi"), "SUB Fehler\ns$=42\nEND SUB\n").unwrap();
|
||||
let out = tbc(&dir, "check", "app.mak");
|
||||
assert!(!out.status.success());
|
||||
assert!(
|
||||
String::from_utf8_lossy(&out.stderr).contains("inner.bi:2:1:"),
|
||||
"{out:?}"
|
||||
);
|
||||
std::fs::write(dir.join("inner.bi"), "SUB Fehler\n200 ERROR 6\nEND SUB\n").unwrap();
|
||||
let out = tbc(&dir, "run", "app.mak");
|
||||
assert_eq!(out.status.code(), Some(2));
|
||||
assert!(
|
||||
String::from_utf8_lossy(&out.stderr).contains("inner.bi:2:5:"),
|
||||
"{out:?}"
|
||||
);
|
||||
std::fs::write(
|
||||
dir.join("error.frm"),
|
||||
"VERSION 1.00\nBEGIN Form F\nEND\n\nSUB Form_Load\nERROR 6\nEND SUB\n",
|
||||
)
|
||||
.unwrap();
|
||||
assert!(tbc(&dir, "build", "error.frm").status.success());
|
||||
std::fs::remove_file(dir.join("error.frm")).unwrap();
|
||||
let out = tbc(&dir, "run", "error.tbc");
|
||||
assert_eq!(out.status.code(), Some(2));
|
||||
assert!(
|
||||
String::from_utf8_lossy(&out.stderr).contains("error.frm:6:1:"),
|
||||
"{out:?}"
|
||||
);
|
||||
std::fs::write(dir.join("empty.bas"), "").unwrap();
|
||||
assert!(tbc(&dir, "run", "empty.bas").status.success());
|
||||
std::fs::remove_dir_all(dir).unwrap();
|
||||
}
|
||||
Reference in New Issue
Block a user