use super::*; #[tokio::test(flavor = "multi_thread")] async fn test_move_parent_node_end() -> anyhow::Result<()> { let tests = vec![ // single cursor stays single cursor, first goes to end of current // node, then parent ( indoc! {r##" fn foo() { let result = if true { "yes" } else { "no#["|]# } } "##}, "", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\"#[\n|]# } } "}, ), ( indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\"#[\n|]# } } "}, "", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\" }#[\n|]# } "}, ), // select mode extends ( indoc! {r##" fn foo() { let result = if true { "yes" } else { #["no"|]# } } "##}, "v", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { #[\"no\" }\n|]# } "}, ), ]; for test in tests { test_with_config(AppBuilder::new().with_file("foo.rs", None), test).await?; } Ok(()) } #[tokio::test(flavor = "multi_thread")] async fn test_move_parent_node_start() -> anyhow::Result<()> { let tests = vec![ // single cursor stays single cursor, first goes to end of current // node, then parent ( indoc! {r##" fn foo() { let result = if true { "yes" } else { "no#["|]# } } "##}, "", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { #[\"|]#no\" } } "}, ), ( indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\"#[\n|]# } } "}, "", indoc! {"\ fn foo() { let result = if true { \"yes\" } else #[{|]# \"no\" } } "}, ), ( indoc! {"\ fn foo() { let result = if true { \"yes\" } else #[{|]# \"no\" } } "}, "", indoc! {"\ fn foo() { let result = if true { \"yes\" } #[e|]#lse { \"no\" } } "}, ), // select mode extends ( indoc! {r##" fn foo() { let result = if true { "yes" } else { #["no"|]# } } "##}, "v", indoc! {"\ fn foo() { let result = if true { \"yes\" } else #[|{ ]#\"no\" } } "}, ), ( indoc! {r##" fn foo() { let result = if true { "yes" } else { #["no"|]# } } "##}, "v", indoc! {"\ fn foo() { let result = if true { \"yes\" } #[|else { ]#\"no\" } } "}, ), ]; for test in tests { test_with_config(AppBuilder::new().with_file("foo.rs", None), test).await?; } 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 ( indoc! {r##" fn foo() { let result = if true { "yes" } else { "no#["|]# } } "##}, "i", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\"#[|\n]# } } "}, ), ( indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\"#[\n|]# } } "}, "i", 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 ( indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no#[\"|]# } } "}, "a", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\" }#[\n|]# } "}, ), // before cursor is all whitespace, so insert tab ( indoc! {"\ fn foo() { let result = if true { \"yes\" } else { #[\"no\"|]# } } "}, "i", 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 ( indoc! {"\ fn foo() { let result = if true { #[\"yes\" } else { \"no\"|]# } } "}, "a", indoc! {"\ fn foo() { let result = if true { \"yes\" } else { \"no\" }#[\n|]# } "}, ), ( indoc! {"\ fn foo() { let result = if true { #[\"yes\" } else { \"no\"|]# } } "}, "i", indoc! {"\ fn foo() { let result = if true { #[|\"yes\" } else { \"no\"]# } } "}, ), ( indoc! {"\ fn foo() { #[l|]#et result = if true { #(\"yes\" } else { \"no\"|)# } } "}, "i", indoc! {"\ fn foo() { #[|l]#et result = if true { #(|\"yes\" } else { \"no\")# } } "}, ), ( indoc! {"\ fn foo() { let result = if true { \"yes\"#[\n|]# } else { \"no\"#(\n|)# } } "}, "i", indoc! {"\ fn foo() { let result = if true { \"yes\" }#[| ]#else { \"no\" }#(|\n)# } "}, ), ( indoc! {"\ fn foo() { let result = if true { #[\"yes\"|]# } else { #(\"no\"|)# } } "}, "i", 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 ( indoc! {"\ fn foo() { let result = if true { #[\"yes\"\n|]# } else { \"no#(\"\n|)# } } "}, "i", indoc! {"\ fn foo() { let result = if true { \"yes\" }#[| ]#else { \"no\" }#(|\n)# } "}, ), // Ctrl-tab always inserts a tab ( indoc! {"\ fn foo() { let result = if true { #[\"yes\"\n|]# } else { \"no#(\"\n|)# } } "}, "i", 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(()) }