use std::sync::Arc; use anyhow::{Context as _, Result}; use dap::adapters::DebugTaskDefinition; use dap::client::DebugAdapterClient; use gpui::{Entity, TestAppContext, WindowHandle}; use project::{Project, debugger::session::Session}; use settings::SettingsStore; use task::TaskContext; use terminal_view::terminal_panel::TerminalPanel; use workspace::Workspace; use crate::{debugger_panel::DebugPanel, session::DebugSession}; #[cfg(test)] mod attach_modal; #[cfg(test)] mod console; #[cfg(test)] mod dap_logger; #[cfg(test)] mod debugger_panel; #[cfg(test)] mod inline_values; #[cfg(test)] mod module_list; #[cfg(test)] mod new_process_modal; #[cfg(test)] mod persistence; #[cfg(test)] mod stack_frame_list; #[cfg(test)] mod variable_list; pub fn init_test(cx: &mut gpui::TestAppContext) { #[cfg(test)] zlog::init_test(); cx.update(|cx| { let settings = SettingsStore::test(cx); cx.set_global(settings); terminal_view::init(cx); theme::init(theme::LoadThemes::JustBase, cx); command_palette_hooks::init(cx); language::init(cx); workspace::init_settings(cx); Project::init_settings(cx); editor::init(cx); crate::init(cx); dap_adapters::init(cx); }); } pub async fn init_test_workspace( project: &Entity, cx: &mut TestAppContext, ) -> WindowHandle { let workspace_handle = cx.add_window(|window, cx| Workspace::test_new(project.clone(), window, cx)); let debugger_panel = workspace_handle .update(cx, |_, window, cx| { cx.spawn_in(window, async move |this, cx| { DebugPanel::load(this, cx).await }) }) .unwrap() .await .expect("Failed to load debug panel"); let terminal_panel = workspace_handle .update(cx, |_, window, cx| { cx.spawn_in(window, async |this, cx| { TerminalPanel::load(this, cx.clone()).await }) }) .unwrap() .await .expect("Failed to load terminal panel"); workspace_handle .update(cx, |workspace, window, cx| { workspace.add_panel(debugger_panel, window, cx); workspace.add_panel(terminal_panel, window, cx); }) .unwrap(); workspace_handle } #[track_caller] pub fn active_debug_session_panel( workspace: WindowHandle, cx: &mut TestAppContext, ) -> Entity { workspace .update(cx, |workspace, _window, cx| { let debug_panel = workspace.panel::(cx).unwrap(); debug_panel .update(cx, |this, _| this.active_session()) .unwrap() }) .unwrap() } pub fn start_debug_session_with) + 'static>( workspace: &WindowHandle, cx: &mut gpui::TestAppContext, config: DebugTaskDefinition, configure: T, ) -> Result> { let _subscription = project::debugger::test::intercept_debug_sessions(cx, configure); workspace.update(cx, |workspace, window, cx| { workspace.start_debug_session( config.to_scenario(), TaskContext::default(), None, window, cx, ) })?; cx.run_until_parked(); let session = workspace.read_with(cx, |workspace, cx| { workspace .panel::(cx) .and_then(|panel| panel.read(cx).active_session()) .map(|session| session.read(cx).running_state().read(cx).session()) .cloned() .context("Failed to get active session") })??; Ok(session) } pub fn start_debug_session) + 'static>( workspace: &WindowHandle, cx: &mut gpui::TestAppContext, configure: T, ) -> Result> { use serde_json::json; start_debug_session_with( workspace, cx, DebugTaskDefinition { adapter: "fake-adapter".into(), label: "test".into(), config: json!({ "request": "launch" }), tcp_connection: None, }, configure, ) }