Forms-Zustand und Darstellung korrigieren und Change archivieren

This commit is contained in:
2026-09-05 20:48:13 +02:00
parent 644a86212f
commit 58b1f620ea
22 changed files with 1362 additions and 101 deletions

View File

@@ -1,4 +1,4 @@
//! Regressionen zum Change ereigniszustellung-und-hostgrenzen.
//! Regressionen zu Ereigniszustellung, Hostgrenzen und Forms-Zustand.
use tb_frontend::forms::{FormCatalog, ObjectClass};
use tb_runtime::host::{CaptureHost, Ereignis, Host, MausArt, MausEreignis};
use tb_runtime::screen::TextScreen;
@@ -582,3 +582,47 @@ fn return_label_verwirft_abgebrochene_eingabe_und_ausdruck() {
assert_eq!(string(&vm, "t"), "b");
}
}
#[test]
fn spaete_timeraktivierung_nutzt_hostzeit_auch_ueber_control_parameter() {
for (setup, start) in [
("", "Timer1.Interval = 100"),
("", "CALL Starten(Timer1)"),
(
"Timer1.Enabled = 0\nTimer1.Interval = 100",
"Timer1.Enabled = -1",
),
] {
let mut vm = vm(&format!("DIM SHARED n%\nForm1.Show\n{setup}\nSTOP\n{start}\nSTOP\nDOEVENTS\nSTOP\nDOEVENTS\nEND\nSUB Starten(t AS CONTROL)\nt.Interval = 100\nEND SUB\nSUB Timer1_Timer()\nSHARED n%\nn% = n% + 1\nEND SUB"));
let mut host = CaptureHost::default();
stop(&mut vm, &mut host);
host.uhr_vorruecken(1000);
stop(&mut vm, &mut host);
assert_eq!(vm.forms.next_deadline(), Some(1100));
host.uhr_vorruecken(99);
stop(&mut vm, &mut host);
assert_eq!(integer(&vm, "n"), 0);
host.uhr_vorruecken(1);
assert_eq!(vm.run(&mut host), RunEvent::Ended);
assert_eq!(integer(&vm, "n"), 1);
}
}
#[test]
fn intervallaenderung_im_handler_verwirft_bereits_faellige_altintervalle() {
let mut vm = vm("DIM SHARED n%\nForm1.Show\nTimer1.Interval = 100\nSLEEP 60\nSTOP\nDOEVENTS\nSTOP\nDOEVENTS\nEND\nSUB Timer1_Timer()\nSHARED n%\nn% = n% + 1\nIF n% = 1 THEN\nSTOP\nTimer1.Interval = 200\nELSE\nTimer1.Interval = 0\nEND IF\nEND SUB");
let mut host = CaptureHost::default();
stop(&mut vm, &mut host); // Im ersten Handler bei 100 ms.
assert_eq!(host.jetzt_ms(), 100);
host.uhr_vorruecken(350);
stop(&mut vm, &mut host); // Alter Rückstau darf nach dem Handler nicht laufen.
assert_eq!(integer(&vm, "n"), 1);
assert_eq!(vm.forms.next_deadline(), Some(650));
host.uhr_vorruecken(199);
stop(&mut vm, &mut host);
assert_eq!(integer(&vm, "n"), 1);
host.uhr_vorruecken(1);
assert_eq!(vm.run(&mut host), RunEvent::Ended);
assert_eq!(integer(&vm, "n"), 2);
assert_eq!(vm.forms.next_deadline(), None);
}