tests.rs

  1use std::sync::Arc;
  2
  3use anyhow::{Context as _, Result};
  4use dap::adapters::DebugTaskDefinition;
  5use dap::client::DebugAdapterClient;
  6use gpui::{Entity, TestAppContext, WindowHandle};
  7use project::{Project, debugger::session::Session};
  8use settings::SettingsStore;
  9use task::SharedTaskContext;
 10use terminal_view::terminal_panel::TerminalPanel;
 11use workspace::MultiWorkspace;
 12use workspace::dock::Panel;
 13
 14use crate::{debugger_panel::DebugPanel, session::DebugSession};
 15
 16#[cfg(test)]
 17mod attach_modal;
 18#[cfg(test)]
 19mod console;
 20#[cfg(test)]
 21mod dap_logger;
 22#[cfg(test)]
 23mod debugger_panel;
 24#[cfg(test)]
 25mod inline_values;
 26#[cfg(test)]
 27mod module_list;
 28#[cfg(test)]
 29mod new_process_modal;
 30#[cfg(test)]
 31mod persistence;
 32#[cfg(test)]
 33mod stack_frame_list;
 34#[cfg(test)]
 35mod variable_list;
 36
 37pub fn init_test(cx: &mut gpui::TestAppContext) {
 38    #[cfg(test)]
 39    zlog::init_test();
 40
 41    cx.update(|cx| {
 42        let settings = SettingsStore::test(cx);
 43        cx.set_global(settings);
 44        terminal_view::init(cx);
 45        theme::init(theme::LoadThemes::JustBase, cx);
 46        command_palette_hooks::init(cx);
 47        editor::init(cx);
 48        crate::init(cx);
 49        dap_adapters::init(cx);
 50    });
 51}
 52
 53pub async fn init_test_workspace(
 54    project: &Entity<Project>,
 55    cx: &mut TestAppContext,
 56) -> WindowHandle<MultiWorkspace> {
 57    let workspace_handle =
 58        cx.add_window(|window, cx| MultiWorkspace::test_new(project.clone(), window, cx));
 59
 60    let debugger_panel = workspace_handle
 61        .update(cx, |multi, window, cx| {
 62            multi.workspace().update(cx, |_workspace, cx| {
 63                cx.spawn_in(window, async move |this, cx| {
 64                    DebugPanel::load(this, cx).await
 65                })
 66            })
 67        })
 68        .unwrap()
 69        .await
 70        .expect("Failed to load debug panel");
 71
 72    let terminal_panel = workspace_handle
 73        .update(cx, |multi, window, cx| {
 74            let weak_workspace = multi.workspace().downgrade();
 75            cx.spawn_in(window, async move |_, cx| {
 76                TerminalPanel::load(weak_workspace, cx.clone()).await
 77            })
 78        })
 79        .unwrap()
 80        .await
 81        .expect("Failed to load terminal panel");
 82
 83    workspace_handle
 84        .update(cx, |multi, window, cx| {
 85            multi.workspace().update(cx, |workspace, cx| {
 86                let position = debugger_panel.read(cx).position(window, cx);
 87                workspace.add_panel(debugger_panel, position, window, cx);
 88                let position = terminal_panel.read(cx).position(window, cx);
 89                workspace.add_panel(terminal_panel, position, window, cx);
 90            });
 91        })
 92        .unwrap();
 93    workspace_handle
 94}
 95
 96#[track_caller]
 97pub fn active_debug_session_panel(
 98    workspace: WindowHandle<MultiWorkspace>,
 99    cx: &mut TestAppContext,
100) -> Entity<DebugSession> {
101    workspace
102        .update(cx, |multi, _window, cx| {
103            multi.workspace().update(cx, |workspace, cx| {
104                let debug_panel = workspace.panel::<DebugPanel>(cx).unwrap();
105                debug_panel
106                    .update(cx, |this, _| this.active_session())
107                    .unwrap()
108            })
109        })
110        .unwrap()
111}
112
113pub fn start_debug_session_with<T: Fn(&Arc<DebugAdapterClient>) + 'static>(
114    workspace: &WindowHandle<MultiWorkspace>,
115    cx: &mut gpui::TestAppContext,
116    config: DebugTaskDefinition,
117    configure: T,
118) -> Result<Entity<Session>> {
119    let _subscription = project::debugger::test::intercept_debug_sessions(cx, configure);
120    workspace.update(cx, |multi, window, cx| {
121        multi.workspace().update(cx, |workspace, cx| {
122            workspace.start_debug_session(
123                config.to_scenario(),
124                SharedTaskContext::default(),
125                None,
126                None,
127                window,
128                cx,
129            )
130        })
131    })?;
132    cx.run_until_parked();
133    let session = workspace.read_with(cx, |workspace, cx| {
134        workspace
135            .workspace()
136            .read(cx)
137            .panel::<DebugPanel>(cx)
138            .and_then(|panel| panel.read(cx).active_session())
139            .map(|session| session.read(cx).running_state().read(cx).session())
140            .cloned()
141            .context("Failed to get active session")
142    })??;
143
144    Ok(session)
145}
146
147pub fn start_debug_session<T: Fn(&Arc<DebugAdapterClient>) + 'static>(
148    workspace: &WindowHandle<MultiWorkspace>,
149    cx: &mut gpui::TestAppContext,
150    configure: T,
151) -> Result<Entity<Session>> {
152    use serde_json::json;
153
154    start_debug_session_with(
155        workspace,
156        cx,
157        DebugTaskDefinition {
158            adapter: "fake-adapter".into(),
159            label: "test".into(),
160            config: json!({
161                "request": "launch"
162            }),
163            tcp_connection: None,
164        },
165        configure,
166    )
167}