helix-mods/helix-term/tests/integration/movement.rs

143 lines
3.2 KiB
Rust
Raw Normal View History

use helix_term::application::Application;
2022-04-17 06:19:22 +02:00
use super::*;
#[tokio::test]
async fn insert_mode_cursor_position() -> anyhow::Result<()> {
test_key_sequence_text_result(
Args::default(),
Config::default(),
TestCase {
in_text: String::new(),
in_selection: Selection::single(0, 0),
in_keys: "i".into(),
out_text: String::new(),
out_selection: Selection::single(0, 0),
},
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
test_key_sequence_text_result(
Args::default(),
Config::default(),
("#[\n|]#", "i", "#[|\n]#"),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
test_key_sequence_text_result(
Args::default(),
Config::default(),
("#[\n|]#", "i<esc>", "#[|\n]#"),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
test_key_sequence_text_result(
Args::default(),
Config::default(),
("#[\n|]#", "i<esc>i", "#[|\n]#"),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
Ok(())
}
/// Range direction is preserved when escaping insert mode to normal
#[tokio::test]
async fn insert_to_normal_mode_cursor_position() -> anyhow::Result<()> {
test_key_sequence_text_result(
Args::default(),
Config::default(),
("#[f|]#oo\n", "vll<A-;><esc>", "#[|foo]#\n"),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
test_key_sequence_text_result(
Args::default(),
Config::default(),
(
indoc! {"\
#[f|]#oo
#(b|)#ar"
},
"vll<A-;><esc>",
indoc! {"\
#[|foo]#
#(|bar)#"
},
),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
test_key_sequence_text_result(
Args::default(),
Config::default(),
(
indoc! {"\
#[f|]#oo
#(b|)#ar"
},
"a",
indoc! {"\
#[fo|]#o
#(ba|)#r"
},
),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
test_key_sequence_text_result(
Args::default(),
Config::default(),
(
indoc! {"\
#[f|]#oo
#(b|)#ar"
},
"a<esc>",
indoc! {"\
#[f|]#oo
#(b|)#ar"
},
),
2022-05-01 02:44:54 +02:00
None,
)
.await?;
2022-04-17 06:19:22 +02:00
Ok(())
}
/// Ensure the very initial cursor in an opened file is the width of
/// the first grapheme
#[tokio::test]
async fn cursor_position_newly_opened_file() -> anyhow::Result<()> {
let test = |content: &str, expected_sel: Selection| {
let file = helpers::temp_file_with_contents(content);
let mut app = Application::new(
Args {
files: vec![(file.path().to_path_buf(), Position::default())],
..Default::default()
},
Config::default(),
)
.unwrap();
let (view, doc) = helix_view::current!(app.editor);
let sel = doc.selection(view.id).clone();
assert_eq!(expected_sel, sel);
};
test("foo", Selection::single(0, 1));
test("👨‍👩‍👧‍👦 foo", Selection::single(0, 7));
test("", Selection::single(0, 0));
Ok(())
}