use crate::platform::types::WindowStateFlag;
use crate::platform::{get_platform, Platform};
fn requested_controls(platform: &dyn Platform) -> Vec<(&'static str, u64)> {
vec![
("button", Platform::create_button(platform, 1, "b", 0, 0, 40, 20)),
("checkbox", Platform::create_checkbox(platform, 1, "c", 0, 0, 40, 20)),
("line_edit", Platform::create_line_edit(platform, 1, "t", 0, 0, 40, 20)),
("label", Platform::create_label(platform, 1, "l", 0, 0, 40, 20)),
("slider", Platform::create_slider(platform, 1, 0, 0, 40, 20)),
("progress_bar", Platform::create_progress_bar(platform, 1, 0, 0, 40, 20)),
("combo_box", Platform::create_combo_box(platform, 1, 0, 0, 40, 20)),
("list_box", Platform::create_list_box(platform, 1, 0, 0, 40, 20)),
("panel", Platform::create_panel(platform, 1, 0, 0, 40, 20)),
("scroll_area", Platform::create_scroll_area(platform, 1, 0, 0, 40, 20)),
("tab_widget", Platform::create_tab_widget(platform, 1, 0, 0, 40, 20)),
("calendar", Platform::create_calendar(platform, 1, 0, 0, 40, 20)),
]
}
#[test]
fn unsupported_controls_report_absence_rather_than_faking_success() {
let platform = get_platform();
platform.init();
for (label, id) in requested_controls(platform) {
if id == 0 {
assert!(
Platform::get_widget_text(platform, id).is_empty(),
"{}: {label} creation reported no control, so its text must be empty",
platform.backend_name()
);
assert!(
!Platform::is_widget_enabled(platform, id),
"{}: {label} creation reported no control, so it cannot be enabled",
platform.backend_name()
);
assert!(
!Platform::is_widget_visible(platform, id),
"{}: {label} creation reported no control, so it cannot be visible",
platform.backend_name()
);
assert!(
!Platform::destroy_widget(platform, id),
"{}: {label} creation reported no control, so there is nothing to destroy",
platform.backend_name()
);
} else {
assert!(
Platform::is_widget_enabled(platform, id),
"{}: {label} reports id {id}, so it must report as enabled",
platform.backend_name()
);
}
}
}
#[test]
fn requesting_unsupported_controls_never_panics() {
let platform = get_platform();
platform.init();
for (_, id) in requested_controls(platform) {
Platform::show_widget(platform, id);
Platform::hide_widget(platform, id);
Platform::set_widget_geometry(platform, id, 1, 2, 3, 4);
Platform::set_widget_text(platform, id, "x");
Platform::set_widget_enabled(platform, id, true);
Platform::set_widget_visible(platform, id, true);
let _ = Platform::get_widget_text(platform, id);
let _ = Platform::is_widget_enabled(platform, id);
let _ = Platform::is_widget_visible(platform, id);
}
}
#[test]
fn unknown_ids_are_reported_as_absent_not_as_state() {
let platform = get_platform();
platform.init();
let unknown = 987_654_321u64;
assert!(Platform::get_widget_text(platform, unknown).is_empty());
assert!(!Platform::is_widget_enabled(platform, unknown));
assert!(!Platform::is_widget_visible(platform, unknown));
assert!(!Platform::destroy_widget(platform, unknown));
Platform::set_widget_text(platform, unknown, "x");
Platform::set_widget_enabled(platform, unknown, true);
Platform::set_widget_visible(platform, unknown, true);
Platform::set_widget_geometry(platform, unknown, 0, 0, 10, 10);
}
#[test]
fn destroyed_ids_are_not_reused() {
let platform = get_platform();
platform.init();
let window = Platform::create_window(platform, "w", 0, 0, 320, 240);
assert_ne!(window, 0, "{} must create a window", platform.backend_name());
let first = Platform::create_label(platform, window, "one", 0, 0, 80, 20);
if first == 0 {
return;
}
assert!(Platform::destroy_widget(platform, first));
let second = Platform::create_label(platform, window, "two", 0, 0, 80, 20);
assert_ne!(second, first, "a destroyed id must not be handed out again");
}
#[test]
fn required_host_capabilities_remain_available() {
let platform = get_platform();
platform.init();
assert!(!platform.backend_name().is_empty(), "a backend must name itself");
assert!(platform.dpi_scale_factor() > 0.0, "DPI must be a positive scale factor");
let window = Platform::create_window(platform, "w", 0, 0, 320, 240);
assert_ne!(window, 0, "every host must be able to create a window");
let _ = Platform::supports_surfaces(platform);
}
#[test]
fn window_state_is_not_applied_to_non_windows() {
let platform = get_platform();
platform.init();
let window = Platform::create_window(platform, "w", 0, 0, 320, 240);
assert_ne!(window, 0);
let not_a_window = 987_654_321u64;
assert_eq!(
Platform::is_window_in_state(platform, not_a_window, WindowStateFlag::Resizable),
None,
"an unknown id must not report window state"
);
assert!(
!Platform::set_window_min_size(platform, not_a_window, 10, 10),
"a non-window must not accept a minimum size"
);
}
#[test]
fn id_allocation_stays_consistent_across_churn() {
let platform = get_platform();
platform.init();
let mut seen = std::collections::HashSet::new();
for round in 0..8 {
let window = Platform::create_window(platform, "w", 0, 0, 200, 150);
assert_ne!(window, 0, "round {round}: window creation must succeed");
assert!(seen.insert(window), "round {round}: a live id was reused");
assert!(Platform::destroy_widget(platform, window));
assert!(!Platform::destroy_widget(platform, window), "destroy must be idempotent");
}
}