From 2aa0b0bf53a61e1d5bcc328fc4e776ffafbf34d2 Mon Sep 17 00:00:00 2001 From: Stu Black Date: Wed, 25 Feb 2026 23:05:11 -0500 Subject: [PATCH] Create an integration test for the WMFontPanel widget. --- WINGs/wings-rs-tests/Makefile.am | 13 +++++++++---- WINGs/wings-rs-tests/build.rs | 17 +++++++++++++++++ WINGs/wings-rs-tests/examples/font_panel.rs | 11 +++++++++++ WINGs/wings-rs-tests/tests/font_panel_tests.rs | 15 +++++++++++++++ .../font_panel_tests__font_panel.snap | 7 +++++++ .../font_panel_tests__font_panel.snap.png | Bin 0 -> 24381 bytes 6 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 WINGs/wings-rs-tests/examples/font_panel.rs create mode 100644 WINGs/wings-rs-tests/tests/font_panel_tests.rs create mode 100644 WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap create mode 100644 WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap.png diff --git a/WINGs/wings-rs-tests/Makefile.am b/WINGs/wings-rs-tests/Makefile.am index ec5fb970..78d6f4c8 100644 --- a/WINGs/wings-rs-tests/Makefile.am +++ b/WINGs/wings-rs-tests/Makefile.am @@ -1,10 +1,8 @@ AUTOMAKE_OPTIONS = RUST_SOURCES = \ - src/lib.rs \ + examples/font_panel.rs \ src/headless/mod.rs \ - src/headless/xvfb.rs \ - src/headless/xwd.rs \ src/headless/snapshots/wings_rs_tests__headless__xvfb__tests__blank_screen.snap \ src/headless/snapshots/wings_rs_tests__headless__xvfb__tests__blank_screen.snap.png \ src/headless/snapshots/wings_rs_tests__headless__xvfb__tests__snowlamp_in_window.snap \ @@ -12,7 +10,14 @@ RUST_SOURCES = \ src/headless/snapshots/wings_rs_tests__headless__xvfb__tests__xeyes.snap \ src/headless/snapshots/wings_rs_tests__headless__xvfb__tests__xeyes.snap.png \ src/headless/snapshots/wings_rs_tests__headless__xwd__tests__snowlamp_encoded.snap \ - src/headless/snapshots/wings_rs_tests__headless__xwd__tests__snowlamp_encoded.snap.png + src/headless/snapshots/wings_rs_tests__headless__xwd__tests__snowlamp_encoded.snap.png \ + src/headless/snowlamp.xwd \ + src/headless/xvfb.rs \ + src/headless/xwd.rs \ + src/lib.rs \ + tests/font_panel_tests.rs \ + tests/snapshots/font_panel_tests__font_panel.snap \ + tests/snapshots/font_panel_tests__font_panel.snap.png RUST_EXTRA = \ Cargo.lock \ diff --git a/WINGs/wings-rs-tests/build.rs b/WINGs/wings-rs-tests/build.rs index 79eb0cc6..4dacd121 100644 --- a/WINGs/wings-rs-tests/build.rs +++ b/WINGs/wings-rs-tests/build.rs @@ -3,4 +3,21 @@ fn main() { println!("cargo:rustc-link-lib=static=xcb"); println!("cargo:rustc-link-lib=static=Xau"); println!("cargo:rustc-link-lib=static=Xdmcp"); + + println!("cargo::rustc-link-search=../.libs"); + println!("cargo::rustc-link-arg-tests=-lWUtil"); + println!("cargo::rustc-link-arg-tests=-lWINGs"); + println!("cargo::rustc-link-arg-tests=-lX11"); + println!("cargo::rustc-link-arg-tests=-lXft"); + println!("cargo::rustc-link-arg-tests=-lpango-1.0"); + println!("cargo::rustc-link-arg-tests=-lpangoxft-1.0"); + println!("cargo::rustc-link-arg-tests=-lpangoft2-1.0"); + + println!("cargo::rustc-link-arg-examples=-lWUtil"); + println!("cargo::rustc-link-arg-examples=-lWINGs"); + println!("cargo::rustc-link-arg-examples=-lX11"); + println!("cargo::rustc-link-arg-examples=-lXft"); + println!("cargo::rustc-link-arg-examples=-lpango-1.0"); + println!("cargo::rustc-link-arg-examples=-lpangoxft-1.0"); + println!("cargo::rustc-link-arg-examples=-lpangoft2-1.0"); } diff --git a/WINGs/wings-rs-tests/examples/font_panel.rs b/WINGs/wings-rs-tests/examples/font_panel.rs new file mode 100644 index 00000000..bbcf6104 --- /dev/null +++ b/WINGs/wings-rs-tests/examples/font_panel.rs @@ -0,0 +1,11 @@ +use wings_rs::WINGsP::{WMGetFontPanel, WMScreenMainLoop, WMShowFontPanel}; +use wings_rs_tests::LiveApplication; + +fn main() { + let app = LiveApplication::new("WMFontPanel"); + unsafe { + let font_panel = WMGetFontPanel(app.screen.as_ptr()); + WMShowFontPanel(font_panel); + WMScreenMainLoop(app.screen.as_ptr()); + } +} diff --git a/WINGs/wings-rs-tests/tests/font_panel_tests.rs b/WINGs/wings-rs-tests/tests/font_panel_tests.rs new file mode 100644 index 00000000..0e8f0a36 --- /dev/null +++ b/WINGs/wings-rs-tests/tests/font_panel_tests.rs @@ -0,0 +1,15 @@ +use std::time::Instant; +use insta_image::assert_png_snapshot; +use wings_rs::WINGsP::{WMGetFontPanel, WMShowFontPanel}; +use wings_rs_tests::HeadlessApplication; + +#[test] +fn show_font_panel() { + let mut app = HeadlessApplication::new(); + unsafe { + let font_panel = WMGetFontPanel(app.screen.as_ptr()); + WMShowFontPanel(font_panel); + } + while app.pump_event_queue(Instant::now()) {} + assert_png_snapshot!("font_panel", app.xvfb.png_screenshot()); +} diff --git a/WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap b/WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap new file mode 100644 index 00000000..fe2be503 --- /dev/null +++ b/WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap @@ -0,0 +1,7 @@ +--- +source: tests/font_panel_tests.rs +assertion_line: 16 +expression: app.xvfb.png_screenshot() +extension: png +snapshot_kind: binary +--- diff --git a/WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap.png b/WINGs/wings-rs-tests/tests/snapshots/font_panel_tests__font_panel.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..e3000130dcb845fda00ff68a9e0f2a5e6f544244 GIT binary patch literal 24381 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