Detailed changes
@@ -210,6 +210,10 @@ impl<'a> EditorTestContext<'a> {
self.assert_selections(expected_selections, marked_text.to_string())
}
+ pub fn editor_state(&mut self) -> String {
+ generate_marked_text(self.buffer_text().as_str(), &self.editor_selections(), true)
+ }
+
#[track_caller]
pub fn assert_editor_background_highlights<Tag: 'static>(&mut self, marked_text: &str) {
let expected_ranges = self.ranges(marked_text);
@@ -248,14 +252,8 @@ impl<'a> EditorTestContext<'a> {
self.assert_selections(expected_selections, expected_marked_text)
}
- #[track_caller]
- fn assert_selections(
- &mut self,
- expected_selections: Vec<Range<usize>>,
- expected_marked_text: String,
- ) {
- let actual_selections = self
- .editor
+ fn editor_selections(&self) -> Vec<Range<usize>> {
+ self.editor
.read_with(self.cx, |editor, cx| editor.selections.all::<usize>(cx))
.into_iter()
.map(|s| {
@@ -265,12 +263,22 @@ impl<'a> EditorTestContext<'a> {
s.start..s.end
}
})
- .collect::<Vec<_>>();
+ .collect::<Vec<_>>()
+ }
+
+ #[track_caller]
+ fn assert_selections(
+ &mut self,
+ expected_selections: Vec<Range<usize>>,
+ expected_marked_text: String,
+ ) {
+ let actual_selections = self.editor_selections();
let actual_marked_text =
generate_marked_text(&self.buffer_text(), &actual_selections, true);
if expected_selections != actual_selections {
panic!(
indoc! {"
+
{}Editor has unexpected selections.
Expected selections:
@@ -255,7 +255,7 @@ impl Motion {
SelectionGoal::None,
),
EndOfParagraph => (
- movement::end_of_paragraph(map, point, times),
+ map.clip_at_line_end(movement::end_of_paragraph(map, point, times)),
SelectionGoal::None,
),
CurrentLine => (end_of_line(map, point), SelectionGoal::None),
@@ -618,12 +618,12 @@ fn next_line_start(map: &DisplaySnapshot, point: DisplayPoint, times: usize) ->
mod test {
- use crate::{state::Mode, test::VimTestContext};
+ use crate::test::NeovimBackedTestContext;
use indoc::indoc;
#[gpui::test]
async fn test_start_end_of_paragraph(cx: &mut gpui::TestAppContext) {
- let mut cx = VimTestContext::new(cx, true).await;
+ let mut cx = NeovimBackedTestContext::new(cx).await;
let initial_state = indoc! {r"ˇabc
def
@@ -637,10 +637,9 @@ mod test {
final"};
// goes down once
- cx.set_state(initial_state, Mode::Normal);
- cx.simulate_keystrokes(["}"]);
- cx.assert_state(
- indoc! {r"abc
+ cx.set_shared_state(initial_state).await;
+ cx.simulate_shared_keystrokes(["}"]).await;
+ cx.assert_shared_state(indoc! {r"abc
def
ˇ
paragraph
@@ -649,18 +648,16 @@ mod test {
third and
- final"},
- Mode::Normal,
- );
+ final"})
+ .await;
// goes up once
- cx.simulate_keystrokes(["{"]);
- cx.assert_state(initial_state, Mode::Normal);
+ cx.simulate_shared_keystrokes(["{"]).await;
+ cx.assert_shared_state(initial_state).await;
// goes down twice
- cx.simulate_keystrokes(["2", "}"]);
- cx.assert_state(
- indoc! {r"abc
+ cx.simulate_shared_keystrokes(["2", "}"]).await;
+ cx.assert_shared_state(indoc! {r"abc
def
paragraph
@@ -669,14 +666,12 @@ mod test {
third and
- final"},
- Mode::Normal,
- );
+ final"})
+ .await;
// goes down over multiple blanks
- cx.simulate_keystrokes(["}"]);
- cx.assert_state(
- indoc! {r"abc
+ cx.simulate_shared_keystrokes(["}"]).await;
+ cx.assert_shared_state(indoc! {r"abc
def
paragraph
@@ -685,14 +680,12 @@ mod test {
third and
- finalˇ"},
- Mode::Normal,
- );
+ finaˇl"})
+ .await;
// goes up twice
- cx.simulate_keystrokes(["2", "{"]);
- cx.assert_state(
- indoc! {r"abc
+ cx.simulate_shared_keystrokes(["2", "{"]).await;
+ cx.assert_shared_state(indoc! {r"abc
def
ˇ
paragraph
@@ -701,8 +694,7 @@ mod test {
third and
- final"},
- Mode::Normal,
- )
+ final"})
+ .await
}
}
@@ -1,9 +1,10 @@
-use std::ops::{Deref, DerefMut};
+use indoc::indoc;
+use std::ops::{Deref, DerefMut, Range};
use collections::{HashMap, HashSet};
use gpui::ContextHandle;
use language::OffsetRangeExt;
-use util::test::marked_text_offsets;
+use util::test::{generate_marked_text, marked_text_offsets};
use super::{neovim_connection::NeovimConnection, NeovimBackedBindingTestContext, VimTestContext};
use crate::state::Mode;
@@ -112,6 +113,43 @@ impl<'a> NeovimBackedTestContext<'a> {
context_handle
}
+ pub async fn assert_shared_state(&mut self, marked_text: &str) {
+ let neovim = self.neovim_state().await;
+ if neovim != marked_text {
+ panic!(
+ indoc! {"Test is incorrect (currently expected != neovim state)
+
+ # currently expected:
+ {}
+ # neovim state:
+ {}
+ # zed state:
+ {}"},
+ marked_text,
+ neovim,
+ self.editor_state(),
+ )
+ }
+ self.assert_editor_state(marked_text)
+ }
+
+ pub async fn neovim_state(&mut self) -> String {
+ generate_marked_text(
+ self.neovim.text().await.as_str(),
+ &vec![self.neovim_selection().await],
+ true,
+ )
+ }
+
+ async fn neovim_selection(&mut self) -> Range<usize> {
+ let mut neovim_selection = self.neovim.selection().await;
+ // Zed selections adjust themselves to make the end point visually make sense
+ if neovim_selection.start > neovim_selection.end {
+ neovim_selection.start.column += 1;
+ }
+ neovim_selection.to_offset(&self.buffer_snapshot())
+ }
+
pub async fn assert_state_matches(&mut self) {
assert_eq!(
self.neovim.text().await,
@@ -120,13 +158,8 @@ impl<'a> NeovimBackedTestContext<'a> {
self.assertion_context()
);
- let mut neovim_selection = self.neovim.selection().await;
- // Zed selections adjust themselves to make the end point visually make sense
- if neovim_selection.start > neovim_selection.end {
- neovim_selection.start.column += 1;
- }
- let neovim_selection = neovim_selection.to_offset(&self.buffer_snapshot());
- self.assert_editor_selections(vec![neovim_selection]);
+ let selections = vec![self.neovim_selection().await];
+ self.assert_editor_selections(selections);
if let Some(neovim_mode) = self.neovim.mode().await {
assert_eq!(neovim_mode, self.mode(), "{}", self.assertion_context(),);
@@ -0,0 +1,13 @@
+{"Put":{"state":"ˇabc\ndef\n\nparagraph\nthe second\n\n\n\nthird and\nfinal"}}
+{"Key":"}"}
+{"Get":{"state":"abc\ndef\nˇ\nparagraph\nthe second\n\n\n\nthird and\nfinal","mode":"Normal"}}
+{"Key":"{"}
+{"Get":{"state":"ˇabc\ndef\n\nparagraph\nthe second\n\n\n\nthird and\nfinal","mode":"Normal"}}
+{"Key":"2"}
+{"Key":"}"}
+{"Get":{"state":"abc\ndef\n\nparagraph\nthe second\nˇ\n\n\nthird and\nfinal","mode":"Normal"}}
+{"Key":"}"}
+{"Get":{"state":"abc\ndef\n\nparagraph\nthe second\n\n\n\nthird and\nfinaˇl","mode":"Normal"}}
+{"Key":"2"}
+{"Key":"{"}
+{"Get":{"state":"abc\ndef\nˇ\nparagraph\nthe second\n\n\n\nthird and\nfinal","mode":"Normal"}}