use cosh_tools::computer::types::{ComputerWait, WaitState};
use cosh_tools::computer::wait::validate;
fn main() {
let spinner_gone = ComputerWait {
name: Some("Reports".into()),
selector: Some("progress_bar[name='Exporting…']".into()),
state: Some(WaitState::Detached),
timeout_ms: Some(30_000),
..Default::default()
};
assert!(validate(&spinner_gone).is_ok());
println!("detached wait: valid — returns WaitOutput {{ met, elapsed_ms, observed }}");
let ok_clickable = ComputerWait {
pid: Some(4242),
selector: Some("button[name='OK']".into()),
state: Some(WaitState::Enabled),
timeout_ms: Some(15_000),
..Default::default()
};
assert!(validate(&ok_clickable).is_ok());
let scopeless = ComputerWait::default();
if let Err(e) = validate(&scopeless) {
println!("missing target rejected: {e}");
}
let both_scopes = ComputerWait {
name: Some("Reports".into()),
pid: Some(4242),
selector: Some("button".into()),
..Default::default()
};
if let Err(e) = validate(&both_scopes) {
println!("double scope rejected: {e}");
}
let too_patient = ComputerWait {
name: Some("Reports".into()),
selector: Some("button".into()),
timeout_ms: Some(61_000),
..Default::default()
};
if let Err(e) = validate(&too_patient) {
println!("over-cap timeout rejected: {e}");
}
let states = [
("attached", WaitState::Attached),
("detached", WaitState::Detached),
("visible", WaitState::Visible),
("hidden", WaitState::Hidden),
("enabled", WaitState::Enabled),
("disabled", WaitState::Disabled),
("focused", WaitState::Focused),
("unfocused", WaitState::Unfocused),
];
for (spelling, state) in states {
let input = ComputerWait {
name: Some("Reports".into()),
selector: Some("button".into()),
state: Some(state),
..Default::default()
};
assert!(validate(&input).is_ok(), "{spelling} must be valid");
println!("{spelling}: ok");
}
}