@@ -1,92 +1,22 @@
1#[cfg(feature = "integration")]
1#[cfg(feature = "integration")]
2mod integration {
2mod integration {
3 use std::path::PathBuf;
5 use std::path::PathBuf;
5− use helix_core::{syntax::AutoPairConfig, Position, Selection, Transaction};
7+ use helix_core::{syntax::AutoPairConfig, Position, Selection};
6− use helix_term::{application::Application, args::Args, config::Config};
8+ use helix_term::{args::Args, config::Config};
7− use helix_view::{doc, input::parse_macro};
9− use crossterm::event::{Event, KeyEvent};
10 use indoc::indoc;
10 use indoc::indoc;
12− pub struct TestCase {
12+ use self::helpers::*;
14− pub in_selection: Selection,
16− pub out_text: String,
17− pub out_selection: Selection,
20− fn test_key_sequence(
21− app: Option<Application>,
22− test_case: &TestCase,
23− test_fn: &dyn Fn(&mut Application),
24− ) -> anyhow::Result<()> {
26− app.unwrap_or_else(|| Application::new(Args::default(), Config::default()).unwrap());
28− let (view, doc) = helix_view::current!(app.editor);
29− let sel = doc.selection(view.id).clone();
31− // replace the initial text with the input text
33− &Transaction::change_by_selection(&doc.text(), &sel, |_| {
34− (0, doc.text().len_chars(), Some((&test_case.in_text).into()))
36− .with_selection(test_case.in_selection.clone()),
40− let input_keys = parse_macro(&test_case.in_keys)?
42− .map(|key_event| Event::Key(KeyEvent::from(key_event)));
44− for key in input_keys {
45− app.handle_terminal_events(Ok(key));
53− /// Use this for very simple test cases where there is one input
54− /// document, selection, and sequence of key presses, and you just
55− /// want to verify the resulting document and selection.
56− fn test_key_sequence_text_result(
60− ) -> anyhow::Result<()> {
61− let app = Application::new(args, config).unwrap();
63− test_key_sequence(Some(app), &test_case, &|app| {
64− let doc = doc!(app.editor);
65− assert_eq!(&test_case.out_text, doc.text());
67− let mut selections: Vec<_> = doc.selections().values().cloned().collect();
68− assert_eq!(1, selections.len());
70− let sel = selections.pop().unwrap();
71− assert_eq!(test_case.out_selection, sel);
77 #[tokio::test]
14 #[tokio::test]
78 async fn hello_world() -> anyhow::Result<()> {
15 async fn hello_world() -> anyhow::Result<()> {
79 test_key_sequence_text_result(
16 test_key_sequence_text_result(
80 Args::default(),
17 Args::default(),
81 Config::default(),
18 Config::default(),
83− in_text: "\n".into(),
84− in_selection: Selection::single(0, 1),
85− // TODO: fix incorrect selection on new doc
86− in_keys: "ihello world<esc>".into(),
19+ ("#[\n|]#", "ihello world<esc>", "hello world#[|\n]#"),
87− out_text: "hello world\n".into(),
88− out_selection: Selection::single(12, 11),
@@ -109,42 +39,79 @@ mod integration {
109 test_key_sequence_text_result(
39 test_key_sequence_text_result(
110 Args::default(),
40 Args::default(),
111 Config::default(),
41 Config::default(),
112− TestCase {
42+ ("#[\n|]#", "i", "#[|\n]#"),
113− in_text: "\n".into(),
114− in_selection: Selection::single(0, 1),
115− in_keys: "i".into(),
116− out_text: "\n".into(),
117− out_selection: Selection::single(1, 0),
121 test_key_sequence_text_result(
45 test_key_sequence_text_result(
122 Args::default(),
46 Args::default(),
123 Config::default(),
47 Config::default(),
124− TestCase {
48+ ("#[\n|]#", "i<esc>", "#[|\n]#"),
125− in_text: "\n".into(),
49+ )?;
126− in_selection: Selection::single(0, 1),
50+
51+ test_key_sequence_text_result(
127− in_keys: "i<esc>i".into(),
54+ ("#[\n|]#", "i<esc>i", "#[|\n]#"),
128− out_text: "\n".into(),
129− out_selection: Selection::single(1, 0),
60+ /// Range direction is preserved when escaping insert mode to normal
136 #[tokio::test]
61 #[tokio::test]
137 async fn insert_to_normal_mode_cursor_position() -> anyhow::Result<()> {
62 async fn insert_to_normal_mode_cursor_position() -> anyhow::Result<()> {
138 test_key_sequence_text_result(
63 test_key_sequence_text_result(
139 Args::default(),
64 Args::default(),
140 Config::default(),
65 Config::default(),
141− TestCase {
66+ ("#[f|]#oo\n", "vll<A-;><esc>", "#[|foo]#\n"),
142− in_text: "\n".into(),
67+ )?;
143− in_selection: Selection::single(0, 1),
68+
144− in_keys: "i".into(),
69+ test_key_sequence_text_result(
145− out_text: "\n".into(),
70+ Args::default(),
146− out_selection: Selection::single(1, 0),
71+ Config::default(),
85+ test_key_sequence_text_result(
101+ test_key_sequence_text_result(
@@ -155,13 +122,7 @@ mod integration {
155 test_key_sequence_text_result(
122 test_key_sequence_text_result(
156 Args::default(),
123 Args::default(),
157 Config::default(),
124 Config::default(),
158− TestCase {
125+ ("#[\n|]#", "i(<esc>", "(#[|)]#\n"),
159− in_text: "\n".into(),
160− in_selection: Selection::single(0, 1),
161− in_keys: "i(<esc>".into(),
162− out_text: "()\n".into(),
163− out_selection: Selection::single(2, 1),
167 test_key_sequence_text_result(
128 test_key_sequence_text_result(
@@ -173,39 +134,30 @@ mod integration {
174 ..Default::default()
135 ..Default::default()
176− TestCase {
137+ ("#[\n|]#", "i(<esc>", "(#[|\n]#"),
177− in_text: "\n".into(),
178− in_selection: Selection::single(0, 1),
179− in_keys: "i(<esc>".into(),
180− out_text: "(\n".into(),
181− out_selection: Selection::single(2, 1),
188 #[tokio::test]
143 #[tokio::test]
189− async fn auto_indent_rs() -> anyhow::Result<()> {
144+ async fn auto_indent_c() -> anyhow::Result<()> {
190 test_key_sequence_text_result(
145 test_key_sequence_text_result(
192 files: vec![(PathBuf::from("foo.c"), Position::default())],
147 files: vec![(PathBuf::from("foo.c"), Position::default())],
193 ..Default::default()
148 ..Default::default()
195 Config::default(),
150 Config::default(),
196− TestCase {
151+ // switches to append mode?
197− in_text: "void foo() {}\n".into(),
153+ "void foo() {#[|}]#\n",
198− in_selection: Selection::single(13, 12),
199− in_keys: "i<ret><esc>".into(),
154+ "i<ret><esc>",
200− out_text: indoc! {r#"
155+ indoc! {"\
201 void foo() {
156 void foo() {
207− out_selection: Selection::single(16, 15),