From bdcc69dc1e5fbfcd5264e702efb9e003b406a656 Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Wed, 17 Dec 2025 14:50:30 -0500 Subject: [PATCH] Check in workspace_with_editor.png, use it --- crates/zed/src/visual_test_runner.rs | 568 ++++++++++++------ .../visual_tests/workspace_with_editor.png | Bin 0 -> 62291 bytes 2 files changed, 393 insertions(+), 175 deletions(-) create mode 100644 crates/zed/test_fixtures/visual_tests/workspace_with_editor.png diff --git a/crates/zed/src/visual_test_runner.rs b/crates/zed/src/visual_test_runner.rs index b36342bcf8e7e3658157063cfa3928f625017981..d257df7e7133e910f3e18d20eaf687c4aafb381e 100644 --- a/crates/zed/src/visual_test_runner.rs +++ b/crates/zed/src/visual_test_runner.rs @@ -1,7 +1,7 @@ //! Visual Test Runner //! -//! This binary runs visual tests on the main thread, which is required on macOS -//! because App construction must happen on the main thread. +//! This binary runs visual regression tests for Zed's UI. It captures screenshots +//! of real Zed windows and compares them against baseline images. //! //! ## Prerequisites //! @@ -15,28 +15,49 @@ //! //! ## Usage //! +//! Run the visual tests: //! cargo run -p zed --bin visual_test_runner --features visual-tests //! -//! ## Environment variables +//! Update baseline images (when UI intentionally changes): +//! UPDATE_BASELINE=1 cargo run -p zed --bin visual_test_runner --features visual-tests //! -//! VISUAL_TEST_OUTPUT_DIR - Directory to save screenshots (default: target/visual_tests) +//! ## Environment Variables +//! +//! UPDATE_BASELINE - Set to update baseline images instead of comparing +//! VISUAL_TEST_OUTPUT_DIR - Directory to save test output (default: target/visual_tests) -use anyhow::Result; +use anyhow::{Context, Result}; use gpui::{ AppContext as _, Application, Bounds, Window, WindowBounds, WindowHandle, WindowOptions, point, px, size, }; +use image::RgbaImage; +use project_panel::ProjectPanel; use settings::SettingsStore; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::sync::Arc; use workspace::{AppState, Workspace}; +/// Baseline images are stored relative to this file +const BASELINE_DIR: &str = "crates/zed/test_fixtures/visual_tests"; + +/// Threshold for image comparison (0.0 to 1.0) +/// Images must match at least this percentage to pass +const MATCH_THRESHOLD: f64 = 0.99; + fn main() { env_logger::builder() .filter_level(log::LevelFilter::Info) .init(); - println!("=== Visual Test Runner ===\n"); + let update_baseline = std::env::var("UPDATE_BASELINE").is_ok(); + + if update_baseline { + println!("=== Visual Test Runner (UPDATE MODE) ===\n"); + println!("Baseline images will be updated.\n"); + } else { + println!("=== Visual Test Runner ===\n"); + } // Create a temporary directory for test files let temp_dir = tempfile::tempdir().expect("Failed to create temp directory"); @@ -44,141 +65,385 @@ fn main() { std::fs::create_dir_all(&project_path).expect("Failed to create project directory"); // Create test files in the real filesystem - println!("Setting up test project at: {:?}", project_path); create_test_files(&project_path); let project_path_clone = project_path.clone(); - Application::new().run(move |cx| { - println!("Initializing Zed..."); - - // Initialize settings store first (required by theme and other subsystems) - let settings_store = SettingsStore::test(cx); - cx.set_global(settings_store); - - // Create AppState using the production-like initialization - let app_state = init_app_state(cx); - - // Initialize all Zed subsystems - gpui_tokio::init(cx); - theme::init(theme::LoadThemes::JustBase, cx); - client::init(&app_state.client, cx); - audio::init(cx); - workspace::init(app_state.clone(), cx); - release_channel::init(semver::Version::new(0, 0, 0), cx); - command_palette::init(cx); - editor::init(cx); - project_panel::init(cx); - outline_panel::init(cx); - terminal_view::init(cx); - image_viewer::init(cx); - search::init(cx); - - println!("Opening Zed workspace..."); - - // Open a real Zed workspace window - let window_size = size(px(1280.0), px(800.0)); - let bounds = Bounds { - origin: point(px(100.0), px(100.0)), - size: window_size, - }; - - // Create a project for the workspace - let project = project::Project::local( - app_state.client.clone(), - app_state.node_runtime.clone(), - app_state.user_store.clone(), - app_state.languages.clone(), - app_state.fs.clone(), - None, - false, - cx, - ); - - let workspace_window: WindowHandle = cx - .open_window( - WindowOptions { - window_bounds: Some(WindowBounds::Windowed(bounds)), - focus: true, - show: true, - ..Default::default() - }, - |window, cx| { - cx.new(|cx| { - Workspace::new(None, project.clone(), app_state.clone(), window, cx) - }) - }, - ) - .expect("Failed to open workspace window"); - - println!("Workspace window opened, adding project folder..."); - - // Add the test project as a worktree - let add_folder_task = workspace_window - .update(cx, |workspace, window, cx| { - workspace.open_paths( - vec![project_path_clone.clone()], - workspace::OpenOptions::default(), - None, - window, - cx, + let test_result = std::panic::catch_unwind(|| { + Application::new().run(move |cx| { + // Initialize settings store first (required by theme and other subsystems) + let settings_store = SettingsStore::test(cx); + cx.set_global(settings_store); + + // Create AppState using the production-like initialization + let app_state = init_app_state(cx); + + // Initialize all Zed subsystems + gpui_tokio::init(cx); + theme::init(theme::LoadThemes::JustBase, cx); + client::init(&app_state.client, cx); + audio::init(cx); + workspace::init(app_state.clone(), cx); + release_channel::init(semver::Version::new(0, 0, 0), cx); + command_palette::init(cx); + editor::init(cx); + project_panel::init(cx); + outline_panel::init(cx); + terminal_view::init(cx); + image_viewer::init(cx); + search::init(cx); + + // Open a real Zed workspace window + let window_size = size(px(1280.0), px(800.0)); + let bounds = Bounds { + origin: point(px(100.0), px(100.0)), + size: window_size, + }; + + // Create a project for the workspace + let project = project::Project::local( + app_state.client.clone(), + app_state.node_runtime.clone(), + app_state.user_store.clone(), + app_state.languages.clone(), + app_state.fs.clone(), + None, + false, + cx, + ); + + let workspace_window: WindowHandle = cx + .open_window( + WindowOptions { + window_bounds: Some(WindowBounds::Windowed(bounds)), + focus: true, + show: true, + ..Default::default() + }, + |window, cx| { + cx.new(|cx| { + Workspace::new(None, project.clone(), app_state.clone(), window, cx) + }) + }, ) - }) - .expect("Failed to update workspace"); - - // Spawn async task to wait for project to load, then capture screenshot - cx.spawn(async move |mut cx| { - // Wait for the folder to be added - println!("Waiting for project to load..."); - add_folder_task.await; - - // Wait for the UI to fully render - println!("Waiting for UI to stabilize..."); - cx.background_executor() - .timer(std::time::Duration::from_secs(2)) - .await; + .expect("Failed to open workspace window"); - println!("Capturing screenshot..."); - - // Try multiple times in case the first attempt fails - let mut result = Err(anyhow::anyhow!("No capture attempts")); - for attempt in 1..=3 { - println!("Capture attempt {}...", attempt); - result = capture_screenshot(workspace_window.into(), &mut cx).await; - if result.is_ok() { - break; - } - if attempt < 3 { - println!("Attempt {} failed, retrying...", attempt); - cx.background_executor() - .timer(std::time::Duration::from_millis(500)) - .await; + // Add the test project as a worktree directly to the project + let add_worktree_task = workspace_window + .update(cx, |workspace, _window, cx| { + workspace.project().update(cx, |project, cx| { + project.find_or_create_worktree(&project_path_clone, true, cx) + }) + }) + .expect("Failed to update workspace"); + + // Spawn async task to set up the UI and capture screenshot + cx.spawn(async move |mut cx| { + // Wait for the worktree to be added + if let Err(e) = add_worktree_task.await { + eprintln!("Failed to add worktree: {:?}", e); } - } - match result { - Ok(path) => { - println!("\n=== Visual Test PASSED ==="); - println!("Screenshot saved to: {}", path); + // Wait for UI to settle + cx.background_executor() + .timer(std::time::Duration::from_millis(500)) + .await; + + // Open the project panel + cx.update(|cx| { + workspace_window + .update(cx, |workspace, window, cx| { + workspace.open_panel::(window, cx); + }) + .ok(); + }) + .ok(); + + // Wait for project panel to render + cx.background_executor() + .timer(std::time::Duration::from_millis(500)) + .await; + + // Open main.rs in the editor + let open_file_task = cx.update(|cx| { + workspace_window + .update(cx, |workspace, window, cx| { + let worktree = workspace.project().read(cx).worktrees(cx).next(); + if let Some(worktree) = worktree { + let worktree_id = worktree.read(cx).id(); + let rel_path: std::sync::Arc = + util::rel_path::rel_path("src/main.rs").into(); + let project_path: project::ProjectPath = + (worktree_id, rel_path.clone()).into(); + Some(workspace.open_path(project_path, None, true, window, cx)) + } else { + None + } + }) + .ok() + .flatten() + }); + + if let Ok(Some(task)) = open_file_task { + if let Ok(item) = task.await { + // Focus the opened item to dismiss the welcome screen + cx.update(|cx| { + workspace_window + .update(cx, |workspace, window, cx| { + let pane = workspace.active_pane().clone(); + pane.update(cx, |pane, cx| { + if let Some(index) = pane.index_for_item(item.as_ref()) { + pane.activate_item(index, true, true, window, cx); + } + }); + }) + .ok(); + }) + .ok(); + + // Wait for item activation to render + cx.background_executor() + .timer(std::time::Duration::from_millis(500)) + .await; + } } - Err(e) => { - eprintln!("\n=== Visual Test FAILED ==="); - eprintln!("Error: {}", e); - eprintln!(); - eprintln!("If you see 'Screen Recording permission' errors:"); - eprintln!(" 1. Open System Settings > Privacy & Security > Screen Recording"); - eprintln!(" 2. Enable your terminal app (Terminal.app, iTerm2, etc.)"); - eprintln!(" 3. Restart your terminal and try again"); + + // Wait for UI to fully stabilize + cx.background_executor() + .timer(std::time::Duration::from_secs(2)) + .await; + + // Run the visual test + let test_result = run_visual_test( + "workspace_with_editor", + workspace_window.into(), + &mut cx, + update_baseline, + ) + .await; + + match test_result { + Ok(TestResult::Passed) => { + println!("\n=== Visual Test PASSED ==="); + } + Ok(TestResult::BaselineUpdated(path)) => { + println!("\n=== Baseline Updated ==="); + println!("New baseline saved to: {}", path.display()); + } + Err(e) => { + eprintln!("\n=== Visual Test FAILED ==="); + eprintln!("Error: {}", e); + std::process::exit(1); + } } - } - cx.update(|cx| cx.quit()).ok(); - }) - .detach(); + cx.update(|cx| cx.quit()).ok(); + }) + .detach(); + }); }); - // Keep temp_dir alive until we're done - it will be dropped here + // Keep temp_dir alive until we're done drop(temp_dir); + + if test_result.is_err() { + std::process::exit(1); + } +} + +enum TestResult { + Passed, + BaselineUpdated(PathBuf), +} + +async fn run_visual_test( + test_name: &str, + window: gpui::AnyWindowHandle, + cx: &mut gpui::AsyncApp, + update_baseline: bool, +) -> Result { + // Capture the screenshot + let screenshot = capture_screenshot(window, cx).await?; + + // Get paths + let baseline_path = get_baseline_path(test_name); + let output_dir = std::env::var("VISUAL_TEST_OUTPUT_DIR") + .unwrap_or_else(|_| "target/visual_tests".to_string()); + let actual_path = Path::new(&output_dir).join(format!("{}.png", test_name)); + + // Create output directory + if let Some(parent) = actual_path.parent() { + std::fs::create_dir_all(parent)?; + } + + // Save the actual screenshot + screenshot.save(&actual_path)?; + println!("Screenshot saved to: {}", actual_path.display()); + + if update_baseline { + // Update the baseline + if let Some(parent) = baseline_path.parent() { + std::fs::create_dir_all(parent)?; + } + screenshot.save(&baseline_path)?; + return Ok(TestResult::BaselineUpdated(baseline_path)); + } + + // Compare against baseline + if !baseline_path.exists() { + return Err(anyhow::anyhow!( + "Baseline image not found: {}\n\ + Run with UPDATE_BASELINE=1 to create it.", + baseline_path.display() + )); + } + + let baseline = image::open(&baseline_path) + .context("Failed to load baseline image")? + .to_rgba8(); + + let comparison = compare_images(&baseline, &screenshot); + + println!( + "Image comparison: {:.2}% match ({} different pixels out of {})", + comparison.match_percentage * 100.0, + comparison.diff_pixel_count, + comparison.total_pixels + ); + + if comparison.match_percentage >= MATCH_THRESHOLD { + Ok(TestResult::Passed) + } else { + // Save the diff image for debugging + if let Some(diff_image) = comparison.diff_image { + let diff_path = Path::new(&output_dir).join(format!("{}_diff.png", test_name)); + diff_image.save(&diff_path)?; + println!("Diff image saved to: {}", diff_path.display()); + } + + Err(anyhow::anyhow!( + "Screenshot does not match baseline.\n\ + Match: {:.2}% (threshold: {:.2}%)\n\ + Actual: {}\n\ + Baseline: {}\n\ + \n\ + Run with UPDATE_BASELINE=1 to update the baseline if this change is intentional.", + comparison.match_percentage * 100.0, + MATCH_THRESHOLD * 100.0, + actual_path.display(), + baseline_path.display() + )) + } +} + +fn get_baseline_path(test_name: &str) -> PathBuf { + // Find the workspace root by looking for Cargo.toml + let mut path = std::env::current_dir().expect("Failed to get current directory"); + while !path.join("Cargo.toml").exists() || !path.join("crates").exists() { + if !path.pop() { + panic!("Could not find workspace root"); + } + } + path.join(BASELINE_DIR).join(format!("{}.png", test_name)) +} + +struct ImageComparison { + match_percentage: f64, + diff_image: Option, + diff_pixel_count: u64, + total_pixels: u64, +} + +fn compare_images(baseline: &RgbaImage, actual: &RgbaImage) -> ImageComparison { + // Check dimensions + if baseline.dimensions() != actual.dimensions() { + return ImageComparison { + match_percentage: 0.0, + diff_image: None, + diff_pixel_count: baseline.width() as u64 * baseline.height() as u64, + total_pixels: baseline.width() as u64 * baseline.height() as u64, + }; + } + + let (width, height) = baseline.dimensions(); + let total_pixels = width as u64 * height as u64; + let mut diff_count: u64 = 0; + let mut diff_image = RgbaImage::new(width, height); + + for y in 0..height { + for x in 0..width { + let baseline_pixel = baseline.get_pixel(x, y); + let actual_pixel = actual.get_pixel(x, y); + + if pixels_are_similar(baseline_pixel, actual_pixel) { + // Matching pixel - show as dimmed version of actual + diff_image.put_pixel( + x, + y, + image::Rgba([ + actual_pixel[0] / 3, + actual_pixel[1] / 3, + actual_pixel[2] / 3, + 255, + ]), + ); + } else { + diff_count += 1; + // Different pixel - highlight in red + diff_image.put_pixel(x, y, image::Rgba([255, 0, 0, 255])); + } + } + } + + let match_percentage = if total_pixels > 0 { + (total_pixels - diff_count) as f64 / total_pixels as f64 + } else { + 1.0 + }; + + ImageComparison { + match_percentage, + diff_image: Some(diff_image), + diff_pixel_count: diff_count, + total_pixels, + } +} + +fn pixels_are_similar(a: &image::Rgba, b: &image::Rgba) -> bool { + // Allow small differences due to anti-aliasing, font rendering, etc. + const TOLERANCE: i16 = 2; + + (a[0] as i16 - b[0] as i16).abs() <= TOLERANCE + && (a[1] as i16 - b[1] as i16).abs() <= TOLERANCE + && (a[2] as i16 - b[2] as i16).abs() <= TOLERANCE + && (a[3] as i16 - b[3] as i16).abs() <= TOLERANCE +} + +async fn capture_screenshot( + window: gpui::AnyWindowHandle, + cx: &mut gpui::AsyncApp, +) -> Result { + // Get the native window ID + let window_id = cx + .update(|cx| { + cx.update_window(window, |_view, window: &mut Window, _cx| { + window.native_window_id() + }) + })?? + .ok_or_else(|| anyhow::anyhow!("Failed to get native window ID"))?; + + // Capture the screenshot + let screenshot = gpui::capture_window_screenshot(window_id) + .await + .map_err(|_| anyhow::anyhow!("Screenshot capture was cancelled"))??; + + println!( + "Screenshot captured: {}x{} pixels", + screenshot.width(), + screenshot.height() + ); + + Ok(screenshot) } /// Create test files in a real filesystem directory @@ -311,7 +576,6 @@ cargo test } /// Initialize AppState with real filesystem for visual testing. -/// This creates a minimal AppState without FakeFs to avoid test dispatcher issues. fn init_app_state(cx: &mut gpui::App) -> Arc { use client::Client; use clock::FakeSystemClock; @@ -340,49 +604,3 @@ fn init_app_state(cx: &mut gpui::App) -> Arc { session, }) } - -async fn capture_screenshot( - window: gpui::AnyWindowHandle, - cx: &mut gpui::AsyncApp, -) -> Result { - // Get the native window ID - let window_id = cx - .update(|cx| { - cx.update_window(window, |_view, window: &mut Window, _cx| { - window.native_window_id() - }) - })?? - .ok_or_else(|| anyhow::anyhow!("Failed to get native window ID"))?; - - println!("Window ID: {}", window_id); - - // Capture the screenshot - let screenshot = gpui::capture_window_screenshot(window_id) - .await - .map_err(|_| anyhow::anyhow!("Screenshot capture was cancelled"))??; - - println!( - "Screenshot captured: {}x{} pixels", - screenshot.width(), - screenshot.height() - ); - - // Determine output path - let output_dir = - std::env::var("VISUAL_TEST_OUTPUT_DIR").unwrap_or_else(|_| "target/visual_tests".into()); - let output_path = Path::new(&output_dir).join("zed_workspace.png"); - - // Create output directory - if let Some(parent) = output_path.parent() { - std::fs::create_dir_all(parent)?; - } - - // Save the screenshot - screenshot.save(&output_path)?; - - // Return absolute path - let abs_path = output_path - .canonicalize() - .unwrap_or_else(|_| output_path.clone()); - Ok(abs_path.display().to_string()) -} diff --git a/crates/zed/test_fixtures/visual_tests/workspace_with_editor.png b/crates/zed/test_fixtures/visual_tests/workspace_with_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aeb4450e7c480e2660c1ee3b915b4f6fd0e93c GIT binary patch literal 62291 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 Kad6o5)&CFMe9T<{ literal 0 HcmV?d00001