From 82828589417c3f30ebb6839e797ff7404259adfd Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Fri, 15 Jul 2022 11:30:14 -0700 Subject: [PATCH 1/2] Updated copy integration test to match retries on terminal integration test --- crates/terminal/src/terminal.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index c2d8fc1bab..9f5ab4ce7f 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -496,11 +496,11 @@ mod tests { } /// Integration test for selections, clipboard, and terminal execution - #[gpui::test] + #[gpui::test(retries = 5)] async fn test_copy(cx: &mut TestAppContext) { let mut result_line: i32 = 0; let terminal = cx.add_view(Default::default(), |cx| Terminal::new(None, false, cx)); - cx.set_condition_duration(Some(Duration::from_secs(2))); + cx.set_condition_duration(Some(Duration::from_secs(5))); terminal.update(cx, |terminal, cx| { terminal.connection.update(cx, |connection, _| { From e156675640302d2ba8a86ea2179703162dcf15bd Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Fri, 15 Jul 2022 12:15:55 -0700 Subject: [PATCH 2/2] Revamped testing in terminals --- crates/terminal/src/terminal.rs | 85 ++++++------------- .../src/tests/terminal_test_context.rs | 82 ++++++++++++++++++ 2 files changed, 107 insertions(+), 60 deletions(-) create mode 100644 crates/terminal/src/tests/terminal_test_context.rs diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 9f5ab4ce7f..2ae3faf103 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -458,85 +458,59 @@ fn get_wd_for_workspace(workspace: &Workspace, cx: &AppContext) -> Option) -> String { - let lines = grid_iterator.group_by(|i| i.point.line.0); - lines - .into_iter() - .map(|(_, line)| line.map(|i| i.c).collect::()) - .collect::>() - .join("\n") - } } diff --git a/crates/terminal/src/tests/terminal_test_context.rs b/crates/terminal/src/tests/terminal_test_context.rs new file mode 100644 index 0000000000..ab0809c3a1 --- /dev/null +++ b/crates/terminal/src/tests/terminal_test_context.rs @@ -0,0 +1,82 @@ +use std::time::Duration; + +use alacritty_terminal::term::SizeInfo; +use gpui::{AppContext, ModelContext, ModelHandle, ReadModelWith, TestAppContext}; +use itertools::Itertools; + +use crate::{ + connection::TerminalConnection, DEBUG_CELL_WIDTH, DEBUG_LINE_HEIGHT, DEBUG_TERMINAL_HEIGHT, + DEBUG_TERMINAL_WIDTH, +}; + +pub struct TerminalTestContext<'a> { + pub cx: &'a mut TestAppContext, + pub connection: ModelHandle, +} + +impl<'a> TerminalTestContext<'a> { + pub fn new(cx: &'a mut TestAppContext) -> Self { + cx.set_condition_duration(Some(Duration::from_secs(5))); + + let size_info = SizeInfo::new( + DEBUG_TERMINAL_WIDTH, + DEBUG_TERMINAL_HEIGHT, + DEBUG_CELL_WIDTH, + DEBUG_LINE_HEIGHT, + 0., + 0., + false, + ); + + let connection = cx.add_model(|cx| TerminalConnection::new(None, size_info, cx)); + + TerminalTestContext { cx, connection } + } + + pub async fn execute_and_wait(&mut self, command: &str, f: F) -> String + where + F: Fn(String, &AppContext) -> bool, + { + let command = command.to_string(); + self.connection.update(self.cx, |connection, _| { + connection.write_to_pty(command); + connection.write_to_pty("\r".to_string()); + }); + + self.connection + .condition(self.cx, |conn, cx| { + let content = Self::grid_as_str(conn); + f(content, cx) + }) + .await; + + self.cx + .read_model_with(&self.connection, &mut |conn, _: &AppContext| { + Self::grid_as_str(conn) + }) + } + + pub fn update_connection(&mut self, f: F) -> S + where + F: FnOnce(&mut TerminalConnection, &mut ModelContext) -> S, + { + self.connection.update(self.cx, |conn, cx| f(conn, cx)) + } + + fn grid_as_str(connection: &TerminalConnection) -> String { + let term = connection.term.lock(); + let grid_iterator = term.renderable_content().display_iter; + let lines = grid_iterator.group_by(|i| i.point.line.0); + lines + .into_iter() + .map(|(_, line)| line.map(|i| i.c).collect::()) + .collect::>() + .join("\n") + } +} + +impl<'a> Drop for TerminalTestContext<'a> { + fn drop(&mut self) { + self.cx.set_condition_duration(None); + } +}