From e07c2bd44ee3f06172df8e983d3b5454e82a91c0 Mon Sep 17 00:00:00 2001 From: helgehelge123 <117832631+helgehelge123@users.noreply.github.com> Date: Thu, 22 Oct 2026 04:31:08 +0200 Subject: [PATCH 1/2] LRC-LIB-LIBFOLDERS: the deep-folder tests put a photo in every level (ready for #1243) The two deep-chain tests now build their library with `deep_folders_app`, as #1243 does: every level holds a photo, so it has a row of its own and starts closed, and the test opens it. They pass the same whether or not the sidebar passes over folders that only lead on. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/tests_panels.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/crates/ui-egui/src/tests_panels.rs b/crates/ui-egui/src/tests_panels.rs index 612c1a4fb..dd2d268fd 100644 --- a/crates/ui-egui/src/tests_panels.rs +++ b/crates/ui-egui/src/tests_panels.rs @@ -1795,6 +1795,28 @@ fn removing_a_disk_from_the_library_asks_first() { assert_eq!(h.app.session.visible().len(), 1, "everything on that disk left the library"); } +/// A library with a photo in every folder down `deep` and two folders below it, in a window +/// `size` big, with every level but the last opened. (Every level holds a photo, so it has a row +/// of its own and starts closed, whether or not the sidebar passes over folders that only lead on.) +fn deep_folders_app(deep: &str, size: [f32; 2]) -> Headless { + let mut paths = vec![format!("{deep}/x/1.jpg"), format!("{deep}/y/2.jpg")]; + let mut levels = Vec::new(); + let mut level = String::new(); + for name in deep.split('/').filter(|n| !n.is_empty()) { + level.push('/'); + level.push_str(name); + paths.push(format!("{level}/0.jpg")); + levels.push(level.clone()); + } + let paths: Vec<&str> = paths.iter().map(String::as_str).collect(); + let mut h = folders_app_sized(&paths, size); + for level in &levels[..levels.len() - 1] { + click(&mut h, &format!("libraryFolderToggle:{level}")); + } + h.settle(SETTLE); + h +} + /// The x of each folder's chevron down the chain `path` (`/a/b/c` → `/a`, `/a/b`, `/a/b/c`). fn chevron_xs(h: &Headless, path: &str) -> Vec { let mut xs: Vec = Vec::new(); @@ -1814,7 +1836,7 @@ fn chevron_xs(h: &Headless, path: &str) -> Vec { fn a_deep_chain_keeps_its_nesting_and_the_sidebar_scrolls_sideways() { let deep = "/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z"; // (tall enough for the whole chain: Recently Deleted is above it now) - let mut h = folders_app_sized(&[&format!("{deep}/x/1.jpg"), &format!("{deep}/y/2.jpg")], [1400.0, 1700.0]); + let mut h = deep_folders_app(deep, [1400.0, 1700.0]); let xs = chevron_xs(&h, deep); let step = crate::panels::left::MIN_INDENT_STEP; assert_eq!(crate::panels::left::indent_step(&h.view.ctx), step, "26 levels do not fit the default panel even at the narrowest step"); @@ -1840,7 +1862,7 @@ fn a_deep_chain_keeps_its_nesting_and_the_sidebar_scrolls_sideways() { #[test] fn a_deep_library_path_narrows_the_indent_instead_of_cutting_the_names() { let deep = "/Users/someone/Library/CloudStorage/Nextcloud-cloud.example.com/RAW/Club/2026-09-24 Team/RAW"; - let mut h = folders_app_sized(&[&format!("{deep}/a/1.jpg"), &format!("{deep}/b/2.jpg")], [1400.0, 1200.0]); + let mut h = deep_folders_app(deep, [1400.0, 1200.0]); let full = crate::panels::left::INDENT_STEP; let narrow = crate::panels::left::indent_step(&h.view.ctx); assert!(narrow < full && narrow >= crate::panels::left::MIN_INDENT_STEP, "the step narrows in the default panel: {narrow}"); From eb7513c5d2657846bdd0f4db83b856dfe8cd0b74 Mon Sep 17 00:00:00 2001 From: helgehelge123 <117832631+helgehelge123@users.noreply.github.com> Date: Thu, 22 Oct 2026 05:10:04 +0200 Subject: [PATCH 2/2] LRC-LIB-LIBFOLDERS: deep_folders_app waits for each row before opening it On the FreeBSD runner a click's synthetic input can arrive a frame or two late, so after opening `/a/b/c/d` the row of `/a/b/c/d/e` was not drawn yet when the next click asked for it. The fixture now steps until each level's chevron is drawn before clicking it. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/tests_panels.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/tests_panels.rs b/crates/ui-egui/src/tests_panels.rs index dd2d268fd..a06d470e3 100644 --- a/crates/ui-egui/src/tests_panels.rs +++ b/crates/ui-egui/src/tests_panels.rs @@ -1810,9 +1810,14 @@ fn deep_folders_app(deep: &str, size: [f32; 2]) -> Headless { } let paths: Vec<&str> = paths.iter().map(String::as_str).collect(); let mut h = folders_app_sized(&paths, size); + // each level is opened once its row is drawn (a slow machine may need more than a frame) for level in &levels[..levels.len() - 1] { - click(&mut h, &format!("libraryFolderToggle:{level}")); + let toggle = format!("libraryFolderToggle:{level}"); + assert!(h.step_until(T, |h| has(h, &toggle)), "{toggle} is drawn"); + click(&mut h, &toggle); } + let last = format!("libraryFolderToggle:{}", levels[levels.len() - 1]); + assert!(h.step_until(T, |h| has(h, &last)), "{last} is drawn"); h.settle(SETTLE); h }