aboutsummaryrefslogtreecommitdiff
path: root/helix-term/tests/test/commands
diff options
context:
space:
mode:
authorSkyler Hawthorne2022-10-08 22:14:49 +0000
committerMichael Davis2023-08-01 14:41:42 +0000
commit15e07d4db893aec7b9e117c1f88400a68ba98ae2 (patch)
treef3d78f1904c596af44e79d0f850c33c3f518f2fb /helix-term/tests/test/commands
parent93acb538121cab36712f40f26fa287df93817de5 (diff)
feat: smart_tab
Implement `smart_tab`, which optionally makes the tab key run the `move_parent_node_start` command when the cursor has non- whitespace to its left.
Diffstat (limited to 'helix-term/tests/test/commands')
-rw-r--r--helix-term/tests/test/commands/movement.rs253
1 files changed, 253 insertions, 0 deletions
diff --git a/helix-term/tests/test/commands/movement.rs b/helix-term/tests/test/commands/movement.rs
index 03dc7ba9..5be68837 100644
--- a/helix-term/tests/test/commands/movement.rs
+++ b/helix-term/tests/test/commands/movement.rs
@@ -197,3 +197,256 @@ async fn test_move_parent_node_start() -> anyhow::Result<()> {
Ok(())
}
+
+#[tokio::test(flavor = "multi_thread")]
+async fn test_smart_tab_move_parent_node_end() -> anyhow::Result<()> {
+ let tests = vec![
+ // single cursor stays single cursor, first goes to end of current
+ // node, then parent
+ (
+ helpers::platform_line(indoc! {r##"
+ fn foo() {
+ let result = if true {
+ "yes"
+ } else {
+ "no#["|]#
+ }
+ }
+ "##}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ \"no\"#[|\n]#
+ }
+ }
+ "}),
+ ),
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ \"no\"#[\n|]#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ \"no\"
+ }#[|\n]#
+ }
+ "}),
+ ),
+ // appending to the end of a line should still look at the current
+ // line, not the next one
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ \"no#[\"|]#
+ }
+ }
+ "}),
+ "a<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ \"no\"
+ }#[\n|]#
+ }
+ "}),
+ ),
+ // before cursor is all whitespace, so insert tab
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ #[\"no\"|]#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ #[|\"no\"]#
+ }
+ }
+ "}),
+ ),
+ // if selection spans multiple lines, it should still only look at the
+ // line on which the head is
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[\"yes\"
+ } else {
+ \"no\"|]#
+ }
+ }
+ "}),
+ "a<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ } else {
+ \"no\"
+ }#[\n|]#
+ }
+ "}),
+ ),
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[\"yes\"
+ } else {
+ \"no\"|]#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[|\"yes\"
+ } else {
+ \"no\"]#
+ }
+ }
+ "}),
+ ),
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ #[l|]#et result = if true {
+ #(\"yes\"
+ } else {
+ \"no\"|)#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ #[|l]#et result = if true {
+ #(|\"yes\"
+ } else {
+ \"no\")#
+ }
+ }
+ "}),
+ ),
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"#[\n|]#
+ } else {
+ \"no\"#(\n|)#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ }#[| ]#else {
+ \"no\"
+ }#(|\n)#
+ }
+ "}),
+ ),
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[\"yes\"|]#
+ } else {
+ #(\"no\"|)#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[|\"yes\"]#
+ } else {
+ #(|\"no\")#
+ }
+ }
+ "}),
+ ),
+ // if any cursors are not preceded by all whitespace, then do the
+ // smart_tab action
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[\"yes\"\n|]#
+ } else {
+ \"no#(\"\n|)#
+ }
+ }
+ "}),
+ "i<tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ \"yes\"
+ }#[| ]#else {
+ \"no\"
+ }#(|\n)#
+ }
+ "}),
+ ),
+ // Ctrl-tab always inserts a tab
+ (
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[\"yes\"\n|]#
+ } else {
+ \"no#(\"\n|)#
+ }
+ }
+ "}),
+ "i<S-tab>",
+ helpers::platform_line(indoc! {"\
+ fn foo() {
+ let result = if true {
+ #[|\"yes\"\n]#
+ } else {
+ \"no #(|\"\n)#
+ }
+ }
+ "}),
+ ),
+ ];
+
+ for test in tests {
+ test_with_config(AppBuilder::new().with_file("foo.rs", None), test).await?;
+ }
+
+ Ok(())
+}