use crate::platform::linux::LinuxPlatform;
use crate::platform::Platform;
#[cfg(all(target_os = "linux", feature = "gtk-native"))]
fn ensure_gtk() -> bool {
gtk::init().is_ok()
}
#[cfg(not(all(target_os = "linux", feature = "gtk-native")))]
#[test]
fn state_backend_reports_honest_name() {
let backend = LinuxPlatform::new();
backend.init();
assert_eq!(backend.backend_name(), "linux-state-backend");
}
#[cfg(not(all(target_os = "linux", feature = "gtk-native")))]
#[test]
fn state_backend_window_lifecycle() {
let backend = LinuxPlatform::new();
backend.init();
let window = backend.create_window("TestWindow", 50, 50, 400, 300);
assert!(window > 0, "Window should be created");
assert!(backend.destroy_widget(window), "an existing window must be destroyable");
assert!(!backend.destroy_widget(window), "a destroyed window must not exist twice");
}
#[cfg(not(all(target_os = "linux", feature = "gtk-native")))]
#[test]
fn state_backend_reports_no_native_controls() {
let backend = LinuxPlatform::new();
backend.init();
let window = backend.create_window("w", 0, 0, 400, 300);
assert!(window > 0);
assert_eq!(backend.create_group_box(window, "g", 0, 0, 10, 10), 0);
assert_eq!(backend.create_frame(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_tab_widget(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_splitter(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_toggle_button(window, "t", 0, 0, 10, 10), 0);
assert_eq!(backend.create_calendar(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_scroll_bar(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_double_spin_box(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_font_combo_box(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_context_menu(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_popup_window(window, "p", 0, 0, 10, 10), 0);
assert_eq!(backend.create_dialog(window, "d", 0, 0, 10, 10), 0);
assert_eq!(backend.create_input_dialog(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_progress_dialog(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_directory_dialog(window, "t", 0, 0, 10, 10), 0);
assert_eq!(backend.create_date_picker(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_time_picker(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_date_time_picker(window, 0, 0, 10, 10), 0);
assert_eq!(backend.create_activity_indicator(window, 0, 0, 10, 10), 0);
}
#[cfg(not(all(target_os = "linux", feature = "gtk-native")))]
#[test]
fn state_backend_owns_no_control_state() {
let backend = LinuxPlatform::new();
backend.init();
let window = backend.create_window("w", 0, 0, 400, 300);
assert_eq!(backend.widget_value(window), None, "no numeric value to report");
assert_eq!(backend.is_widget_checked(window), None, "nothing here is checkable");
assert!(!backend.is_widget_visible(window), "the host holds no control visibility");
}
#[cfg(not(all(target_os = "linux", feature = "gtk-native")))]
#[test]
fn state_backend_linux_subsystems_still_forward() {
let backend = LinuxPlatform::new();
backend.init();
assert!(backend.set_clipboard_text("linux_clip_test"));
assert_eq!(backend.get_clipboard_text(), "linux_clip_test");
let window = backend.create_window("w", 0, 0, 400, 300);
if let Some(bridge) = <LinuxPlatform as Platform>::accessibility_bridge(&backend) {
let _ = bridge.accessibility_name(window);
}
assert_eq!(
<LinuxPlatform as Platform>::accessibility_bridge(&backend).is_some(),
cfg!(target_os = "linux"),
"the AT-SPI bridge is available exactly on Linux"
);
}
#[cfg(all(target_os = "linux", feature = "gtk-native"))]
#[test]
fn gtk_native_backend_lifecycle() {
if !ensure_gtk() {
let backend = LinuxPlatform::new();
backend.init();
assert_eq!(backend.backend_name(), "linux-state-backend");
return;
}
let backend = LinuxPlatform::new();
backend.init();
assert_eq!(backend.backend_name(), "gtk");
let window = backend.create_window("TestWindow", 50, 50, 400, 300);
assert!(window > 0, "Window should be created");
assert_eq!(backend.create_button(window, "Click", 10, 10, 80, 24), 0);
assert_eq!(backend.create_label(window, "Hello", 10, 40, 80, 24), 0);
assert_eq!(backend.create_checkbox(window, "Check", 10, 70, 80, 24), 0);
assert_eq!(backend.create_line_edit(window, "edit", 10, 100, 160, 24), 0);
assert_eq!(backend.create_slider(window, 10, 160, 200, 24), 0);
assert!(backend.set_clipboard_text("linux_clip_test"));
assert_eq!(backend.get_clipboard_text(), "linux_clip_test");
assert!(backend.set_clipboard_text(""));
assert_eq!(backend.get_clipboard_text(), "");
backend.set_clipboard_text("native-clipboard-proof");
if let Some(display) = gtk::gdk::Display::default() {
if let Some(clipboard) = gtk::Clipboard::default(&display) {
let native = clipboard.wait_for_text().map(|s| s.to_string());
assert_eq!(
native.as_deref(),
Some("native-clipboard-proof"),
"clipboard text must be visible through the native GDK clipboard"
);
}
}
if let Some(bridge) =
<crate::platform::linux::LinuxPlatform as Platform>::accessibility_bridge(&backend)
{
let _ = bridge.accessibility_name(window);
}
assert!(backend.destroy_widget(window), "the window must be destroyable");
assert!(!backend.destroy_widget(window), "a destroyed window must not exist twice");
}