From f5991657f47a26347e7a5350945e654238cacc77 Mon Sep 17 00:00:00 2001 From: Skyler Hawthorne Date: Sun, 31 Mar 2024 08:12:17 -0400 Subject: [PATCH] Factor out line ending handling in integration tests (#9921) Prior to this change, every integration test which wanted its line endings to be handled transparently across platforms, i.e. test with the same input that has its platform's line feed characters, converting the line endings was up to each individual test by calling the `platform_line` helper function. This significantly increases the amount of boilerplate one has to copy between all the tests. However, there are some test cases that need to exert strict control over the exact input text without being manipulated behind the scenes by the test framework. So, with this change, the line feed conversions are factored into the `TestCase` struct. By default, line endings of the input text are converted to the platform's native line feed ending, but one can explicitly specify in their test case when the input text should be left alone and tested as is. --- helix-term/tests/test/auto_indent.rs | 6 +- helix-term/tests/test/auto_pairs.rs | 28 ++ helix-term/tests/test/commands.rs | 283 ++++++++++---------- helix-term/tests/test/commands/movement.rs | 152 +++++------ helix-term/tests/test/commands/write.rs | 37 +-- helix-term/tests/test/helpers.rs | 76 ++++-- helix-term/tests/test/languages/go.rs | 16 +- helix-term/tests/test/languages/yaml.rs | 296 ++++++++++----------- helix-term/tests/test/movement.rs | 109 ++++---- helix-term/tests/test/splits.rs | 31 ++- helix-vcs/src/lib.rs | 8 +- 11 files changed, 564 insertions(+), 478 deletions(-) diff --git a/helix-term/tests/test/auto_indent.rs b/helix-term/tests/test/auto_indent.rs index 5132d44d9..5ea1024b7 100644 --- a/helix-term/tests/test/auto_indent.rs +++ b/helix-term/tests/test/auto_indent.rs @@ -6,13 +6,13 @@ async fn auto_indent_c() -> anyhow::Result<()> { AppBuilder::new().with_file("foo.c", None), // switches to append mode? ( - helpers::platform_line("void foo() {#[|}]#"), + "void foo() {#[|}]#", "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ void foo() { #[|\n]#\ } - "}), + "}, ), ) .await?; diff --git a/helix-term/tests/test/auto_pairs.rs b/helix-term/tests/test/auto_pairs.rs index ada488fc9..c921e2ae7 100644 --- a/helix-term/tests/test/auto_pairs.rs +++ b/helix-term/tests/test/auto_pairs.rs @@ -19,6 +19,7 @@ async fn insert_basic() -> anyhow::Result<()> { format!("#[{}|]#", LINE_END), format!("i{}", pair.0), format!("{}#[|{}]#{}", pair.0, pair.1, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -46,6 +47,7 @@ async fn insert_configured_multi_byte_chars() -> anyhow::Result<()> { format!("#[{}|]#", LINE_END), format!("i{}", open), format!("{}#[|{}]#{}", open, close, LINE_END), + LineFeedHandling::AsIs, ), ) .await?; @@ -56,6 +58,7 @@ async fn insert_configured_multi_byte_chars() -> anyhow::Result<()> { format!("{}#[{}|]#{}", open, close, LINE_END), format!("i{}", close), format!("{}{}#[|{}]#", open, close, LINE_END), + LineFeedHandling::AsIs, ), ) .await?; @@ -71,6 +74,7 @@ async fn insert_after_word() -> anyhow::Result<()> { format!("foo#[{}|]#", LINE_END), format!("i{}", pair.0), format!("foo{}#[|{}]#{}", pair.0, pair.1, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -80,6 +84,7 @@ async fn insert_after_word() -> anyhow::Result<()> { format!("foo#[{}|]#", LINE_END), format!("i{}", pair.0), format!("foo{}#[|{}]#", pair.0, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -94,6 +99,7 @@ async fn insert_before_word() -> anyhow::Result<()> { format!("#[f|]#oo{}", LINE_END), format!("i{}", pair.0), format!("{}#[|f]#oo{}", pair.0, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -108,6 +114,7 @@ async fn insert_before_word_selection() -> anyhow::Result<()> { format!("#[foo|]#{}", LINE_END), format!("i{}", pair.0), format!("{}#[|foo]#{}", pair.0, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -122,6 +129,7 @@ async fn insert_before_word_selection_trailing_word() -> anyhow::Result<()> { format!("foo#[ wor|]#{}", LINE_END), format!("i{}", pair.0), format!("foo{}#[|{} wor]#{}", pair.0, pair.1, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -136,6 +144,7 @@ async fn insert_closer_selection_trailing_word() -> anyhow::Result<()> { format!("foo{}#[|{} wor]#{}", pair.0, pair.1, LINE_END), format!("i{}", pair.1), format!("foo{}{}#[| wor]#{}", pair.0, pair.1, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -155,6 +164,7 @@ async fn insert_before_eol() -> anyhow::Result<()> { open = pair.0, close = pair.1 ), + LineFeedHandling::AsIs, )) .await?; } @@ -177,6 +187,7 @@ async fn insert_auto_pairs_disabled() -> anyhow::Result<()> { format!("#[{}|]#", LINE_END), format!("i{}", pair.0), format!("{}#[|{}]#", pair.0, LINE_END), + LineFeedHandling::AsIs, ), ) .await?; @@ -197,6 +208,7 @@ async fn insert_multi_range() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -211,6 +223,7 @@ async fn insert_before_multi_code_point_graphemes() -> anyhow::Result<()> { format!("hello #[๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ|]# goodbye{}", LINE_END), format!("i{}", pair.1), format!("hello {}#[|๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ]# goodbye{}", pair.1, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -226,6 +239,7 @@ async fn insert_at_end_of_document() -> anyhow::Result<()> { in_keys: format!("i{}", pair.0), out_text: format!("{}{}{}", LINE_END, pair.0, pair.1), out_selection: Selection::single(LINE_END.len() + 1, LINE_END.len() + 2), + line_feed_handling: LineFeedHandling::AsIs, }) .await?; @@ -235,6 +249,7 @@ async fn insert_at_end_of_document() -> anyhow::Result<()> { in_keys: format!("i{}", pair.0), out_text: format!("foo{}{}{}", LINE_END, pair.0, pair.1), out_selection: Selection::single(LINE_END.len() + 4, LINE_END.len() + 5), + line_feed_handling: LineFeedHandling::AsIs, }) .await?; } @@ -259,6 +274,7 @@ async fn insert_close_inside_pair() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -283,6 +299,7 @@ async fn insert_close_inside_pair_multi() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -307,6 +324,7 @@ async fn insert_nested_open_inside_pair() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -338,6 +356,7 @@ async fn insert_nested_open_inside_pair_multi() -> anyhow::Result<()> { inner_close = inner_pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -358,6 +377,7 @@ async fn append_basic() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -377,6 +397,7 @@ async fn append_multi_range() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -401,6 +422,7 @@ async fn append_close_inside_pair() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -425,6 +447,7 @@ async fn append_close_inside_pair_multi() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -444,6 +467,7 @@ async fn append_end_of_word() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -458,6 +482,7 @@ async fn append_middle_of_word() -> anyhow::Result<()> { format!("#[wo|]#rd{}", LINE_END), format!("a{}", pair.1), format!("#[wo{}r|]#d{}", pair.1, LINE_END), + LineFeedHandling::AsIs, )) .await?; } @@ -477,6 +502,7 @@ async fn append_end_of_word_multi() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -501,6 +527,7 @@ async fn append_inside_nested_pair() -> anyhow::Result<()> { close = pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } @@ -532,6 +559,7 @@ async fn append_inside_nested_pair_multi() -> anyhow::Result<()> { inner_close = inner_pair.1, eol = LINE_END ), + LineFeedHandling::AsIs, )) .await?; } diff --git a/helix-term/tests/test/commands.rs b/helix-term/tests/test/commands.rs index 1172a7981..aaa442f36 100644 --- a/helix-term/tests/test/commands.rs +++ b/helix-term/tests/test/commands.rs @@ -9,89 +9,89 @@ mod write; async fn test_selection_duplication() -> anyhow::Result<()> { // Forward test(( - platform_line(indoc! {"\ + indoc! {"\ #[lo|]#rem ipsum dolor - "}), + "}, "CC", - platform_line(indoc! {"\ + indoc! {"\ #(lo|)#rem #(ip|)#sum #[do|]#lor - "}), + "}, )) .await?; // Backward test(( - platform_line(indoc! {"\ + indoc! {"\ #[|lo]#rem ipsum dolor - "}), + "}, "CC", - platform_line(indoc! {"\ + indoc! {"\ #(|lo)#rem #(|ip)#sum #[|do]#lor - "}), + "}, )) .await?; // Copy the selection to previous line, skipping the first line in the file test(( - platform_line(indoc! {"\ + indoc! {"\ test #[testitem|]# - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ test #[testitem|]# - "}), + "}, )) .await?; // Copy the selection to previous line, including the first line in the file test(( - platform_line(indoc! {"\ + indoc! {"\ test #[test|]# - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ #[test|]# #(test|)# - "}), + "}, )) .await?; // Copy the selection to next line, skipping the last line in the file test(( - platform_line(indoc! {"\ + indoc! {"\ #[testitem|]# test - "}), + "}, "C", - platform_line(indoc! {"\ + indoc! {"\ #[testitem|]# test - "}), + "}, )) .await?; // Copy the selection to next line, including the last line in the file test(( - platform_line(indoc! {"\ + indoc! {"\ #[test|]# test - "}), + "}, "C", - platform_line(indoc! {"\ + indoc! {"\ #(test|)# #[test|]# - "}), + "}, )) .await?; Ok(()) @@ -159,17 +159,17 @@ async fn test_goto_file_impl() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_multi_selection_paste() -> anyhow::Result<()> { test(( - platform_line(indoc! {"\ + indoc! {"\ #[|lorem]# #(|ipsum)# #(|dolor)# - "}), + "}, "yp", - platform_line(indoc! {"\ + indoc! {"\ lorem#[|lorem]# ipsum#(|ipsum)# dolor#(|dolor)# - "}), + "}, )) .await?; @@ -180,58 +180,58 @@ async fn test_multi_selection_paste() -> anyhow::Result<()> { async fn test_multi_selection_shell_commands() -> anyhow::Result<()> { // pipe test(( - platform_line(indoc! {"\ + indoc! {"\ #[|lorem]# #(|ipsum)# #(|dolor)# - "}), + "}, "|echo foo", - platform_line(indoc! {"\ + indoc! {"\ #[|foo\n]# #(|foo\n)# #(|foo\n)# - "}), + "}, )) .await?; // insert-output test(( - platform_line(indoc! {"\ + indoc! {"\ #[|lorem]# #(|ipsum)# #(|dolor)# - "}), + "}, "!echo foo", - platform_line(indoc! {"\ + indoc! {"\ #[|foo\n]# lorem #(|foo\n)# ipsum #(|foo\n)# dolor - "}), + "}, )) .await?; // append-output test(( - platform_line(indoc! {"\ + indoc! {"\ #[|lorem]# #(|ipsum)# #(|dolor)# - "}), + "}, "echo foo", - platform_line(indoc! {"\ + indoc! {"\ lorem#[|foo\n]# ipsum#(|foo\n)# dolor#(|foo\n)# - "}), + "}, )) .await?; @@ -247,7 +247,13 @@ async fn test_undo_redo() -> anyhow::Result<()> { // * u Undo the two newlines. We're now on line 1. // * Jump forward an back again in the jumplist. This would panic // if the jumplist were not being updated correctly. - test(("#[|]#", "2[u", "#[|]#")).await?; + test(( + "#[|]#", + "2[u", + "#[|]#", + LineFeedHandling::AsIs, + )) + .await?; // A jumplist selection is passed through an edit and then an undo and then a redo. // @@ -258,10 +264,22 @@ async fn test_undo_redo() -> anyhow::Result<()> { // * Jump back in the jumplist. This would panic if the jumplist were not being // updated correctly. // * Jump forward to line 1. - test(("#[|]#", "[kduU", "#[|]#")).await?; + test(( + "#[|]#", + "[kduU", + "#[|]#", + LineFeedHandling::AsIs, + )) + .await?; // In this case we 'redo' manually to ensure that the transactions are composing correctly. - test(("#[|]#", "[u[u", "#[|]#")).await?; + test(( + "#[|]#", + "[u[u", + "#[|]#", + LineFeedHandling::AsIs, + )) + .await?; Ok(()) } @@ -270,35 +288,35 @@ async fn test_undo_redo() -> anyhow::Result<()> { async fn test_extend_line() -> anyhow::Result<()> { // extend with line selected then count test(( - platform_line(indoc! {"\ + indoc! {"\ #[l|]#orem ipsum dolor - "}), + "}, "x2x", - platform_line(indoc! {"\ + indoc! {"\ #[lorem ipsum dolor\n|]# - "}), + "}, )) .await?; // extend with count on partial selection test(( - platform_line(indoc! {"\ + indoc! {"\ #[l|]#orem ipsum - "}), + "}, "2x", - platform_line(indoc! {"\ + indoc! {"\ #[lorem ipsum\n|]# - "}), + "}, )) .await?; @@ -366,16 +384,11 @@ async fn test_character_info() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_delete_char_backward() -> anyhow::Result<()> { // don't panic when deleting overlapping ranges + test(("#(x|)# #[x|]#", "c", "#[\n|]#")).await?; test(( - platform_line("#(x|)# #[x|]#"), - "c", - platform_line("#[\n|]#"), - )) - .await?; - test(( - platform_line("#( |)##( |)#a#( |)#axx#[x|]#a"), + "#( |)##( |)#a#( |)#axx#[x|]#a", "li", - platform_line("#(a|)##(|a)#xx#[|a]#"), + "#(a|)##(|a)#xx#[|a]#", )) .await?; @@ -385,43 +398,33 @@ async fn test_delete_char_backward() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_delete_word_backward() -> anyhow::Result<()> { // don't panic when deleting overlapping ranges - test(( - platform_line("fo#[o|]#ba#(r|)#"), - "a", - platform_line("#[\n|]#"), - )) - .await?; + test(("fo#[o|]#ba#(r|)#", "a", "#[\n|]#")).await?; Ok(()) } #[tokio::test(flavor = "multi_thread")] async fn test_delete_word_forward() -> anyhow::Result<()> { // don't panic when deleting overlapping ranges - test(( - platform_line("fo#[o|]#b#(|ar)#"), - "i", - platform_line("fo#[\n|]#"), - )) - .await?; + test(("fo#[o|]#b#(|ar)#", "i", "fo#[\n|]#")).await?; Ok(()) } #[tokio::test(flavor = "multi_thread")] async fn test_delete_char_forward() -> anyhow::Result<()> { test(( - platform_line(indoc! {"\ + indoc! {"\ #[abc|]#def #(abc|)#ef #(abc|)#f #(abc|)# - "}), + "}, "a", - platform_line(indoc! {"\ + indoc! {"\ #[abc|]#ef #(abc|)#f #(abc|)# #(abc|)# - "}), + "}, )) .await?; @@ -430,33 +433,37 @@ async fn test_delete_char_forward() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_insert_with_indent() -> anyhow::Result<()> { - const INPUT: &str = "\ -#[f|]#n foo() { - if let Some(_) = None { + const INPUT: &str = indoc! { " + #[f|]#n foo() { + if let Some(_) = None { - } -\x20 -} + } + + } -fn bar() { + fn bar() { -}"; + } + " + }; // insert_at_line_start test(( INPUT, ":lang rust%I", - "\ -#[f|]#n foo() { - #(i|)#f let Some(_) = None { - #(\n|)#\ -\x20 #(}|)# -#(\x20|)# -#(}|)# -#(\n|)#\ -#(f|)#n bar() { - #(\n|)#\ -#(}|)#", + indoc! { " + #[f|]#n foo() { + #(i|)#f let Some(_) = None { + #(\n|)# + #(}|)# + #( |)# + #(}|)# + #(\n|)# + #(f|)#n bar() { + #(\n|)# + #(}|)# + " + }, )) .await?; @@ -464,17 +471,19 @@ fn bar() { test(( INPUT, ":lang rust%A", - "\ -fn foo() {#[\n|]#\ -\x20 if let Some(_) = None {#(\n|)#\ -\x20 #(\n|)#\ -\x20 }#(\n|)#\ -\x20#(\n|)#\ -}#(\n|)#\ -#(\n|)#\ -fn bar() {#(\n|)#\ -\x20 #(\n|)#\ -}#(|)#", + indoc! { " + fn foo() {#[\n|]# + if let Some(_) = None {#(\n|)# + #(\n|)# + }#(\n|)# + #(\n|)# + }#(\n|)# + #(\n|)# + fn bar() {#(\n|)# + #(\n|)# + }#(\n|)# + " + }, )) .await?; @@ -485,42 +494,42 @@ fn bar() {#(\n|)#\ async fn test_join_selections() -> anyhow::Result<()> { // normal join test(( - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, "J", - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, )) .await?; // join with empty line test(( - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, "JJ", - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, )) .await?; // join with additional space in non-empty line test(( - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, "JJ", - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, )) .await?; @@ -531,7 +540,7 @@ async fn test_join_selections() -> anyhow::Result<()> { async fn test_join_selections_space() -> anyhow::Result<()> { // join with empty lines panic test(( - platform_line(indoc! {"\ + indoc! {"\ #[a b @@ -541,69 +550,69 @@ async fn test_join_selections_space() -> anyhow::Result<()> { d e|]# - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ a#[ |]#b#( |)#c#( |)#d#( |)#e - "}), + "}, )) .await?; // normal join test(( - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ abc#[ |]#def - "}), + "}, )) .await?; // join with empty line test(( - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, )) .await?; // join with additional space in non-empty line test(( - platform_line(indoc! {"\ + indoc! {"\ #[a|]#bc def - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ abc#[ |]#def - "}), + "}, )) .await?; // join with retained trailing spaces test(( - platform_line(indoc! {"\ + indoc! {"\ #[aaa bb c |]# - "}), + "}, "", - platform_line(indoc! {"\ + indoc! {"\ aaa #[ |]#bb #( |)#c - "}), + "}, )) .await?; diff --git a/helix-term/tests/test/commands/movement.rs b/helix-term/tests/test/commands/movement.rs index 5be68837c..34c9d23b2 100644 --- a/helix-term/tests/test/commands/movement.rs +++ b/helix-term/tests/test/commands/movement.rs @@ -6,7 +6,7 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { // single cursor stays single cursor, first goes to end of current // node, then parent ( - helpers::platform_line(indoc! {r##" + indoc! {r##" fn foo() { let result = if true { "yes" @@ -14,9 +14,9 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { "no#["|]# } } - "##}), + "##}, "", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -24,10 +24,10 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { \"no\"#[\n|]# } } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -35,9 +35,9 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { \"no\"#[\n|]# } } - "}), + "}, "", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -45,11 +45,11 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { \"no\" }#[\n|]# } - "}), + "}, ), // select mode extends ( - helpers::platform_line(indoc! {r##" + indoc! {r##" fn foo() { let result = if true { "yes" @@ -57,9 +57,9 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { #["no"|]# } } - "##}), + "##}, "v", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -67,7 +67,7 @@ async fn test_move_parent_node_end() -> anyhow::Result<()> { #[\"no\" }\n|]# } - "}), + "}, ), ]; @@ -84,7 +84,7 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { // single cursor stays single cursor, first goes to end of current // node, then parent ( - helpers::platform_line(indoc! {r##" + indoc! {r##" fn foo() { let result = if true { "yes" @@ -92,9 +92,9 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { "no#["|]# } } - "##}), + "##}, "", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -102,10 +102,10 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { #[\"|]#no\" } } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -113,9 +113,9 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { \"no\"#[\n|]# } } - "}), + "}, "", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -123,10 +123,10 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { \"no\" } } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -134,9 +134,9 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { \"no\" } } - "}), + "}, "", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -144,11 +144,11 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { \"no\" } } - "}), + "}, ), // select mode extends ( - helpers::platform_line(indoc! {r##" + indoc! {r##" fn foo() { let result = if true { "yes" @@ -156,9 +156,9 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { #["no"|]# } } - "##}), + "##}, "v", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -166,10 +166,10 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { ]#\"no\" } } - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" fn foo() { let result = if true { "yes" @@ -177,9 +177,9 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { #["no"|]# } } - "##}), + "##}, "v", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -187,7 +187,7 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> { ]#\"no\" } } - "}), + "}, ), ]; @@ -204,7 +204,7 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { // single cursor stays single cursor, first goes to end of current // node, then parent ( - helpers::platform_line(indoc! {r##" + indoc! {r##" fn foo() { let result = if true { "yes" @@ -212,9 +212,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { "no#["|]# } } - "##}), + "##}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -222,10 +222,10 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"#[|\n]# } } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -233,9 +233,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"#[\n|]# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -243,12 +243,12 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\" }#[|\n]# } - "}), + "}, ), // appending to the end of a line should still look at the current // line, not the next one ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -256,9 +256,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no#[\"|]# } } - "}), + "}, "a", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -266,11 +266,11 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\" }#[\n|]# } - "}), + "}, ), // before cursor is all whitespace, so insert tab ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -278,9 +278,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { #[\"no\"|]# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -288,12 +288,12 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { #[|\"no\"]# } } - "}), + "}, ), // if selection spans multiple lines, it should still only look at the // line on which the head is ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[\"yes\" @@ -301,9 +301,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"|]# } } - "}), + "}, "a", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -311,10 +311,10 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\" }#[\n|]# } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[\"yes\" @@ -322,9 +322,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"|]# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[|\"yes\" @@ -332,10 +332,10 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"]# } } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { #[l|]#et result = if true { #(\"yes\" @@ -343,9 +343,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"|)# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { #[|l]#et result = if true { #(|\"yes\" @@ -353,10 +353,10 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\")# } } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\"#[\n|]# @@ -364,9 +364,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\"#(\n|)# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -374,10 +374,10 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\" }#(|\n)# } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[\"yes\"|]# @@ -385,9 +385,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { #(\"no\"|)# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[|\"yes\"]# @@ -395,12 +395,12 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { #(|\"no\")# } } - "}), + "}, ), // if any cursors are not preceded by all whitespace, then do the // smart_tab action ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[\"yes\"\n|]# @@ -408,9 +408,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no#(\"\n|)# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { \"yes\" @@ -418,11 +418,11 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no\" }#(|\n)# } - "}), + "}, ), // Ctrl-tab always inserts a tab ( - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[\"yes\"\n|]# @@ -430,9 +430,9 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no#(\"\n|)# } } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ fn foo() { let result = if true { #[|\"yes\"\n]# @@ -440,7 +440,7 @@ async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> { \"no #(|\"\n)# } } - "}), + "}, ), ]; diff --git a/helix-term/tests/test/commands/write.rs b/helix-term/tests/test/commands/write.rs index f65352c7e..7259b4e58 100644 --- a/helix-term/tests/test/commands/write.rs +++ b/helix-term/tests/test/commands/write.rs @@ -94,7 +94,10 @@ async fn test_buffer_close_concurrent() -> anyhow::Result<()> { ) .await?; - helpers::assert_file_has_content(file.as_file_mut(), &platform_line(&RANGE.end().to_string()))?; + helpers::assert_file_has_content( + file.as_file_mut(), + &LineFeedHandling::Native.apply(&RANGE.end().to_string()), + )?; Ok(()) } @@ -121,7 +124,7 @@ async fn test_write() -> anyhow::Result<()> { file.as_file_mut().read_to_string(&mut file_content)?; assert_eq!( - helpers::platform_line("the gostak distims the doshes"), + LineFeedHandling::Native.apply("the gostak distims the doshes"), file_content ); @@ -138,7 +141,7 @@ async fn test_overwrite_protection() -> anyhow::Result<()> { helpers::run_event_loop_until_idle(&mut app).await; file.as_file_mut() - .write_all(helpers::platform_line("extremely important content").as_bytes())?; + .write_all("extremely important content".as_bytes())?; file.as_file_mut().flush()?; file.as_file_mut().sync_all()?; @@ -152,10 +155,7 @@ async fn test_overwrite_protection() -> anyhow::Result<()> { let mut file_content = String::new(); file.as_file_mut().read_to_string(&mut file_content)?; - assert_eq!( - helpers::platform_line("extremely important content"), - file_content - ); + assert_eq!("extremely important content", file_content); Ok(()) } @@ -182,7 +182,7 @@ async fn test_write_quit() -> anyhow::Result<()> { file.as_file_mut().read_to_string(&mut file_content)?; assert_eq!( - helpers::platform_line("the gostak distims the doshes"), + LineFeedHandling::Native.apply("the gostak distims the doshes"), file_content ); @@ -210,7 +210,10 @@ async fn test_write_concurrent() -> anyhow::Result<()> { let mut file_content = String::new(); file.as_file_mut().read_to_string(&mut file_content)?; - assert_eq!(platform_line(&RANGE.end().to_string()), file_content); + assert_eq!( + LineFeedHandling::Native.apply(&RANGE.end().to_string()), + file_content + ); Ok(()) } @@ -276,7 +279,7 @@ async fn test_write_scratch_to_new_path() -> anyhow::Result<()> { ) .await?; - helpers::assert_file_has_content(file.as_file_mut(), &helpers::platform_line("hello"))?; + helpers::assert_file_has_content(file.as_file_mut(), &LineFeedHandling::Native.apply("hello"))?; Ok(()) } @@ -361,12 +364,12 @@ async fn test_write_new_path() -> anyhow::Result<()> { helpers::assert_file_has_content( file1.as_file_mut(), - &helpers::platform_line("i can eat glass, it will not hurt me\n"), + &LineFeedHandling::Native.apply("i can eat glass, it will not hurt me\n"), )?; helpers::assert_file_has_content( file2.as_file_mut(), - &helpers::platform_line("i can eat glass, it will not hurt me\n"), + &LineFeedHandling::Native.apply("i can eat glass, it will not hurt me\n"), )?; Ok(()) @@ -437,7 +440,7 @@ async fn test_write_insert_final_newline_added_if_missing() -> anyhow::Result<() helpers::assert_file_has_content( file.as_file_mut(), - &helpers::platform_line("have you tried chamomile tea?\n"), + &LineFeedHandling::Native.apply("have you tried chamomile tea?\n"), )?; Ok(()) @@ -448,14 +451,14 @@ async fn test_write_insert_final_newline_unchanged_if_not_missing() -> anyhow::R let mut file = tempfile::NamedTempFile::new()?; let mut app = helpers::AppBuilder::new() .with_file(file.path(), None) - .with_input_text(&helpers::platform_line("#[t|]#en minutes, please\n")) + .with_input_text(LineFeedHandling::Native.apply("#[t|]#en minutes, please\n")) .build()?; test_key_sequence(&mut app, Some(":w"), None, false).await?; helpers::assert_file_has_content( file.as_file_mut(), - &helpers::platform_line("ten minutes, please\n"), + &LineFeedHandling::Native.apply("ten minutes, please\n"), )?; Ok(()) @@ -508,12 +511,12 @@ async fn test_write_all_insert_final_newline_add_if_missing_and_modified() -> an helpers::assert_file_has_content( file1.as_file_mut(), - &helpers::platform_line("we don't serve time travelers here\n"), + &LineFeedHandling::Native.apply("we don't serve time travelers here\n"), )?; helpers::assert_file_has_content( file2.as_file_mut(), - &helpers::platform_line("a time traveler walks into a bar\n"), + &LineFeedHandling::Native.apply("a time traveler walks into a bar\n"), )?; Ok(()) diff --git a/helix-term/tests/test/helpers.rs b/helix-term/tests/test/helpers.rs index a978f386e..41eab4273 100644 --- a/helix-term/tests/test/helpers.rs +++ b/helix-term/tests/test/helpers.rs @@ -14,6 +14,46 @@ use helix_view::{current_ref, doc, editor::LspConfig, input::parse_macro, Editor use tempfile::NamedTempFile; use tokio_stream::wrappers::UnboundedReceiverStream; +/// Specify how to set up the input text with line feeds +#[derive(Clone, Debug)] +pub enum LineFeedHandling { + /// Replaces all LF chars with the system's appropriate line feed character, + /// and if one doesn't exist already, appends the system's appropriate line + /// ending to the end of a string. + Native, + + /// Do not modify the input text in any way. What you give is what you test. + AsIs, +} + +impl LineFeedHandling { + /// Apply the line feed handling to the input string, yielding a set of + /// resulting texts with the appropriate line feed substitutions. + pub fn apply(&self, text: &str) -> String { + let line_end = match self { + LineFeedHandling::Native => helix_core::NATIVE_LINE_ENDING, + LineFeedHandling::AsIs => return text.into(), + } + .as_str(); + + // we can assume that the source files in this code base will always + // be LF, so indoc strings will always insert LF + let mut output = text.replace('\n', line_end); + + if !output.ends_with(line_end) { + output.push_str(line_end); + } + + output + } +} + +impl Default for LineFeedHandling { + fn default() -> Self { + Self::Native + } +} + #[derive(Clone, Debug)] pub struct TestCase { pub in_text: String, @@ -21,6 +61,8 @@ pub struct TestCase { pub in_keys: String, pub out_text: String, pub out_selection: Selection, + + pub line_feed_handling: LineFeedHandling, } impl From<(S, R, V)> for TestCase @@ -30,8 +72,19 @@ where V: Into, { fn from((input, keys, output): (S, R, V)) -> Self { - let (in_text, in_selection) = test::print(&input.into()); - let (out_text, out_selection) = test::print(&output.into()); + TestCase::from((input, keys, output, LineFeedHandling::default())) + } +} + +impl From<(S, R, V, LineFeedHandling)> for TestCase +where + S: Into, + R: Into, + V: Into, +{ + fn from((input, keys, output, line_feed_handling): (S, R, V, LineFeedHandling)) -> Self { + let (in_text, in_selection) = test::print(&line_feed_handling.apply(&input.into())); + let (out_text, out_selection) = test::print(&line_feed_handling.apply(&output.into())); TestCase { in_text, @@ -39,6 +92,7 @@ where in_keys: keys.into(), out_text, out_selection, + line_feed_handling, } } } @@ -137,6 +191,7 @@ pub async fn test_key_sequence_with_input_text>( should_exit: bool, ) -> anyhow::Result<()> { let test_case = test_case.into(); + let mut app = match app { Some(app) => app, None => Application::new(Args::default(), test_config(), test_syntax_loader(None))?, @@ -240,23 +295,6 @@ pub fn test_editor_config() -> helix_view::editor::Config { } } -/// Replaces all LF chars with the system's appropriate line feed -/// character, and if one doesn't exist already, appends the system's -/// appropriate line ending to the end of a string. -pub fn platform_line(input: &str) -> String { - let line_end = helix_core::NATIVE_LINE_ENDING.as_str(); - - // we can assume that the source files in this code base will always - // be LF, so indoc strings will always insert LF - let mut output = input.replace('\n', line_end); - - if !output.ends_with(line_end) { - output.push_str(line_end); - } - - output -} - /// Creates a new temporary file that is set to read only. Useful for /// testing write failures. pub fn new_readonly_tempfile() -> anyhow::Result { diff --git a/helix-term/tests/test/languages/go.rs b/helix-term/tests/test/languages/go.rs index 7bb3651e6..57ef92f82 100644 --- a/helix-term/tests/test/languages/go.rs +++ b/helix-term/tests/test/languages/go.rs @@ -6,30 +6,30 @@ async fn auto_indent() -> anyhow::Result<()> { let enter_tests = [ ( - helpers::platform_line(indoc! {r##" + indoc! {r##" type Test struct {#[}|]# - "##}), + "##}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ type Test struct { \t#[|\n]# } - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ func main() { \tswitch nil {#[}|]# } - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ func main() { \tswitch nil { \t\t#[|\n]# \t} } - "}), + "}, ), ]; diff --git a/helix-term/tests/test/languages/yaml.rs b/helix-term/tests/test/languages/yaml.rs index 7669e8a27..10e1861d4 100644 --- a/helix-term/tests/test/languages/yaml.rs +++ b/helix-term/tests/test/languages/yaml.rs @@ -6,7 +6,7 @@ async fn auto_indent() -> anyhow::Result<()> { let below_tests = [ ( - helpers::platform_line(indoc! {r##" + indoc! {r##" #[t|]#op: baz: foo bazi: @@ -17,9 +17,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: #[\n|]# baz: foo @@ -31,10 +31,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: b#[a|]#z: foo bazi: @@ -45,9 +45,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo #[\n|]# @@ -59,10 +59,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: baz: foo bazi#[:|]# @@ -73,9 +73,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -87,10 +87,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: baz: foo bazi: @@ -101,9 +101,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -115,10 +115,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: baz: foo bazi: @@ -129,9 +129,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -143,10 +143,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -157,9 +157,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -171,10 +171,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -185,9 +185,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -199,10 +199,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -213,9 +213,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook:#[\n|]# - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -227,10 +227,10 @@ async fn auto_indent() -> anyhow::Result<()> { bax: foox fook: #[\n|]# - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: | @@ -239,9 +239,9 @@ async fn auto_indent() -> anyhow::Result<()> { line string#[\n|]# fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: | @@ -251,10 +251,10 @@ async fn auto_indent() -> anyhow::Result<()> { string #[\n|]# fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > @@ -263,9 +263,9 @@ async fn auto_indent() -> anyhow::Result<()> { line#[\n|]# string fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > @@ -275,74 +275,74 @@ async fn auto_indent() -> anyhow::Result<()> { #[\n|]# string fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: >#[\n|]# fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > #[\n|]# fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ - top:#[\n|]# baz: foo bax: foox fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: #[\n|]# baz: foo bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo#[\n|]# bax: foox fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo #[\n|]# bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo bax: foox#[\n|]# fook: - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo bax: foox #[\n|]# fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: - one: two#[\n|]# @@ -350,9 +350,9 @@ async fn auto_indent() -> anyhow::Result<()> { - top: baz: foo bax: foox - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: - one: two @@ -361,42 +361,42 @@ async fn auto_indent() -> anyhow::Result<()> { - top: baz: foo bax: foox - "}), + "}, ), // yaml map without a key ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top:#[\n|]# - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: #[\n|]# - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top#[:|]# bottom: withvalue - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: #[\n|]# bottom: withvalue - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ bottom: withvalue top#[:|]# - "}), + "}, "o", - helpers::platform_line(indoc! {"\ + indoc! {"\ bottom: withvalue top: #[\n|]# - "}), + "}, ), ]; @@ -406,7 +406,7 @@ async fn auto_indent() -> anyhow::Result<()> { let above_tests = [ ( - helpers::platform_line(indoc! {r##" + indoc! {r##" #[t|]#op: baz: foo bazi: @@ -417,9 +417,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ #[\n|]# top: baz: foo @@ -431,10 +431,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: b#[a|]#z: foo bazi: @@ -445,9 +445,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: #[\n|]# baz: foo @@ -459,10 +459,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: baz: foo bazi#[:|]# @@ -473,9 +473,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo #[\n|]# @@ -487,10 +487,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: baz: foo bazi: @@ -501,9 +501,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -515,10 +515,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {r##" + indoc! {r##" top: baz: foo bazi: @@ -529,9 +529,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "##}), + "##}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -543,10 +543,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -557,9 +557,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -571,10 +571,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -585,9 +585,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -599,10 +599,10 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -613,9 +613,9 @@ async fn auto_indent() -> anyhow::Result<()> { - 2 bax: foox fook:#[\n|]# - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bazi: @@ -627,10 +627,10 @@ async fn auto_indent() -> anyhow::Result<()> { bax: foox #[\n|]# fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: | @@ -639,9 +639,9 @@ async fn auto_indent() -> anyhow::Result<()> { line string#[\n|]# fook: - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: | @@ -651,10 +651,10 @@ async fn auto_indent() -> anyhow::Result<()> { #[\n|]# string fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > @@ -663,9 +663,9 @@ async fn auto_indent() -> anyhow::Result<()> { line string fook: - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > @@ -675,58 +675,58 @@ async fn auto_indent() -> anyhow::Result<()> { line string fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > fook:#[\n|]# - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: foo bax: > #[\n|]# fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo#[\n|]# bax: foox fook: - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: #[\n|]# baz: foo bax: foox fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo bax: foox fook:#[\n|]# - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ - top: baz: foo bax: foox #[\n|]# fook: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: - one: two#[\n|]# @@ -734,9 +734,9 @@ async fn auto_indent() -> anyhow::Result<()> { - top: baz: foo bax: foox - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: baz: #[\n|]# @@ -745,42 +745,42 @@ async fn auto_indent() -> anyhow::Result<()> { - top: baz: foo bax: foox - "}), + "}, ), // yaml map without a key ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top:#[\n|]# - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ #[\n|]# top: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ bottom: withvalue top#[:|]# - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ bottom: withvalue #[\n|]# top: - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ top: bottom:#[ |]#withvalue - "}), + "}, "O", - helpers::platform_line(indoc! {"\ + indoc! {"\ top: #[\n|]# bottom: withvalue - "}), + "}, ), ]; @@ -790,24 +790,24 @@ async fn auto_indent() -> anyhow::Result<()> { let enter_tests = [ ( - helpers::platform_line(indoc! {r##" + indoc! {r##" foo: #[b|]#ar - "##}), + "##}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ foo: #[|b]#ar - "}), + "}, ), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ foo:#[\n|]# - "}), + "}, "i", - helpers::platform_line(indoc! {"\ + indoc! {"\ foo: #[|\n]# - "}), + "}, ), ]; diff --git a/helix-term/tests/test/movement.rs b/helix-term/tests/test/movement.rs index 1c25032c2..9ecaf6bb0 100644 --- a/helix-term/tests/test/movement.rs +++ b/helix-term/tests/test/movement.rs @@ -8,6 +8,7 @@ async fn insert_mode_cursor_position() -> anyhow::Result<()> { in_keys: "i".into(), out_text: String::new(), out_selection: Selection::single(0, 0), + line_feed_handling: LineFeedHandling::AsIs, }) .await?; @@ -392,20 +393,10 @@ async fn cursor_position_newly_opened_file() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn cursor_position_append_eof() -> anyhow::Result<()> { // Selection is forwards - test(( - "#[foo|]#", - "abar", - helpers::platform_line("#[foobar|]#\n"), - )) - .await?; + test(("#[foo|]#", "abar", "#[foobar|]#\n")).await?; // Selection is backwards - test(( - "#[|foo]#", - "abar", - helpers::platform_line("#[foobar|]#\n"), - )) - .await?; + test(("#[|foo]#", "abar", "#[foobar|]#\n")).await?; Ok(()) } @@ -415,19 +406,19 @@ async fn select_mode_tree_sitter_next_function_is_union_of_objects() -> anyhow:: test_with_config( AppBuilder::new().with_file("foo.rs", None), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ #[/|]#// Increments fn inc(x: usize) -> usize { x + 1 } /// Decrements fn dec(x: usize) -> usize { x - 1 } - "}), + "}, "]fv]f", - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments #[fn inc(x: usize) -> usize { x + 1 } /// Decrements fn dec(x: usize) -> usize { x - 1 }|]# - "}), + "}, ), ) .await?; @@ -440,19 +431,19 @@ async fn select_mode_tree_sitter_prev_function_unselects_object() -> anyhow::Res test_with_config( AppBuilder::new().with_file("foo.rs", None), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments #[fn inc(x: usize) -> usize { x + 1 } /// Decrements fn dec(x: usize) -> usize { x - 1 }|]# - "}), + "}, "v[f", - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments #[fn inc(x: usize) -> usize { x + 1 }|]# /// Decrements fn dec(x: usize) -> usize { x - 1 } - "}), + "}, ), ) .await?; @@ -466,23 +457,23 @@ async fn select_mode_tree_sitter_prev_function_goes_backwards_to_object() -> any test_with_config( AppBuilder::new().with_file("foo.rs", None), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments fn inc(x: usize) -> usize { x + 1 } /// Decrements fn dec(x: usize) -> usize { x - 1 } /// Identity #[fn ident(x: usize) -> usize { x }|]# - "}), + "}, "v[f", - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments fn inc(x: usize) -> usize { x + 1 } /// Decrements #[|fn dec(x: usize) -> usize { x - 1 } /// Identity ]#fn ident(x: usize) -> usize { x } - "}), + "}, ), ) .await?; @@ -490,23 +481,23 @@ async fn select_mode_tree_sitter_prev_function_goes_backwards_to_object() -> any test_with_config( AppBuilder::new().with_file("foo.rs", None), ( - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments fn inc(x: usize) -> usize { x + 1 } /// Decrements fn dec(x: usize) -> usize { x - 1 } /// Identity #[fn ident(x: usize) -> usize { x }|]# - "}), + "}, "v[f[f", - helpers::platform_line(indoc! {"\ + indoc! {"\ /// Increments #[|fn inc(x: usize) -> usize { x + 1 } /// Decrements fn dec(x: usize) -> usize { x - 1 } /// Identity ]#fn ident(x: usize) -> usize { x } - "}), + "}, ), ) .await?; @@ -517,36 +508,36 @@ async fn select_mode_tree_sitter_prev_function_goes_backwards_to_object() -> any #[tokio::test(flavor = "multi_thread")] async fn find_char_line_ending() -> anyhow::Result<()> { test(( - helpers::platform_line(indoc! { + indoc! { "\ one #[|t]#wo three" - }), + }, "Tgll2f", - helpers::platform_line(indoc! { + indoc! { "\ one two#[ |]#three" - }), + }, )) .await?; test(( - helpers::platform_line(indoc! { + indoc! { "\ #[|o]#ne two three" - }), + }, "f2tghTF", - helpers::platform_line(indoc! { + indoc! { "\ one#[| t]#wo three" - }), + }, )) .await?; @@ -556,41 +547,41 @@ async fn find_char_line_ending() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_surround_replace() -> anyhow::Result<()> { test(( - platform_line(indoc! {"\ + indoc! {"\ (#[|a]#) - "}), + "}, "mrm{", - platform_line(indoc! {"\ + indoc! {"\ {#[|a]#} - "}), + "}, )) .await?; test(( - platform_line(indoc! {"\ + indoc! {"\ (#[a|]#) - "}), + "}, "mrm{", - platform_line(indoc! {"\ + indoc! {"\ {#[a|]#} - "}), + "}, )) .await?; test(( - platform_line(indoc! {"\ + indoc! {"\ {{ #(}|)# #[}|]# - "}), + "}, "mrm)", - platform_line(indoc! {"\ + indoc! {"\ (( #()|)# #[)|]# - "}), + "}, )) .await?; @@ -600,36 +591,36 @@ async fn test_surround_replace() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_surround_delete() -> anyhow::Result<()> { test(( - platform_line(indoc! {"\ + indoc! {"\ (#[|a]#) - "}), + "}, "mdm", - platform_line(indoc! {"\ + indoc! {"\ #[|a]# - "}), + "}, )) .await?; test(( - platform_line(indoc! {"\ + indoc! {"\ (#[a|]#) - "}), + "}, "mdm", - platform_line(indoc! {"\ + indoc! {"\ #[a|]# - "}), + "}, )) .await?; test(( - platform_line(indoc! {"\ + indoc! {"\ {{ #(}|)# #[}|]# - "}), + "}, "mdm", - platform_line("\n\n#(\n|)##[\n|]#"), + "\n\n#(\n|)##[\n|]#", )) .await?; diff --git a/helix-term/tests/test/splits.rs b/helix-term/tests/test/splits.rs index 3b66c0486..f19e30041 100644 --- a/helix-term/tests/test/splits.rs +++ b/helix-term/tests/test/splits.rs @@ -62,9 +62,18 @@ async fn test_split_write_quit_all() -> anyhow::Result<()> { ) .await?; - helpers::assert_file_has_content(file1.as_file_mut(), &platform_line("hello1"))?; - helpers::assert_file_has_content(file2.as_file_mut(), &platform_line("hello2"))?; - helpers::assert_file_has_content(file3.as_file_mut(), &platform_line("hello3"))?; + helpers::assert_file_has_content( + file1.as_file_mut(), + &LineFeedHandling::Native.apply("hello1"), + )?; + helpers::assert_file_has_content( + file2.as_file_mut(), + &LineFeedHandling::Native.apply("hello2"), + )?; + helpers::assert_file_has_content( + file3.as_file_mut(), + &LineFeedHandling::Native.apply("hello3"), + )?; Ok(()) } @@ -91,7 +100,7 @@ async fn test_split_write_quit_same_file() -> anyhow::Result<()> { let doc = docs.pop().unwrap(); assert_eq!( - helpers::platform_line("hello\ngoodbye"), + LineFeedHandling::Native.apply("hello\ngoodbye"), doc.text().to_string() ); @@ -110,7 +119,7 @@ async fn test_split_write_quit_same_file() -> anyhow::Result<()> { let doc = docs.pop().unwrap(); assert_eq!( - helpers::platform_line("hello\ngoodbye"), + LineFeedHandling::Native.apply("hello\ngoodbye"), doc.text().to_string() ); @@ -124,7 +133,7 @@ async fn test_split_write_quit_same_file() -> anyhow::Result<()> { helpers::assert_file_has_content( file.as_file_mut(), - &helpers::platform_line("hello\ngoodbye"), + &LineFeedHandling::Native.apply("hello\ngoodbye"), )?; Ok(()) @@ -151,7 +160,13 @@ async fn test_changes_in_splits_apply_to_all_views() -> anyhow::Result<()> { // // This panicked in the past because the jumplist entry on line 2 of window 2 // was not updated and after the `kd` step, pointed outside of the document. - test(("#[|]#", "v[wkdqd", "#[|]#")).await?; + test(( + "#[|]#", + "v[wkdqd", + "#[|]#", + LineFeedHandling::AsIs, + )) + .await?; // Transactions are applied to the views for windows lazily when they are focused. // This case panics if the transactions and inversions are not applied in the @@ -160,6 +175,7 @@ async fn test_changes_in_splits_apply_to_all_views() -> anyhow::Result<()> { "#[|]#", "[[[vuuuwUUUquuu", "#[|]#", + LineFeedHandling::AsIs, )) .await?; @@ -185,6 +201,7 @@ async fn test_changes_in_splits_apply_to_all_views() -> anyhow::Result<()> { "#[|]#", "3[vwuu3[q%d", "#[|]#", + LineFeedHandling::AsIs, )) .await?; diff --git a/helix-vcs/src/lib.rs b/helix-vcs/src/lib.rs index 63487fbcd..851fd6e91 100644 --- a/helix-vcs/src/lib.rs +++ b/helix-vcs/src/lib.rs @@ -46,8 +46,8 @@ impl DiffProviderRegistry { .find_map(|provider| match provider.get_diff_base(file) { Ok(res) => Some(res), Err(err) => { - log::info!("{err:#?}"); - log::info!("failed to open diff base for {}", file.display()); + log::debug!("{err:#?}"); + log::debug!("failed to open diff base for {}", file.display()); None } }) @@ -59,8 +59,8 @@ impl DiffProviderRegistry { .find_map(|provider| match provider.get_current_head_name(file) { Ok(res) => Some(res), Err(err) => { - log::info!("{err:#?}"); - log::info!("failed to obtain current head name for {}", file.display()); + log::debug!("{err:#?}"); + log::debug!("failed to obtain current head name for {}", file.display()); None } })