@ -64,6 +64,307 @@ async fn insert_to_normal_mode_cursor_position() -> anyhow::Result<()> {
Ok ( ( ) )
Ok ( ( ) )
}
}
#[ tokio::test(flavor = " multi_thread " ) ]
async fn surround_by_character ( ) -> anyhow ::Result < ( ) > {
// Only pairs matching the passed character count
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"mi{" ,
"(so [many {#[good|]#} text] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"mi[" ,
"(so [#[many {good} text|]#] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"mi(" ,
"(#[so [many {good} text] here|]#)" ,
) )
. await ? ;
// Works with characters that aren't pairs too
test ( (
"'so 'many 'go#[o|]#d' text' here'" ,
"mi'" ,
"'so 'many '#[good|]#' text' here'" ,
) )
. await ? ;
test ( (
"'so 'many 'go#[o|]#d' text' here'" ,
"2mi'" ,
"'so '#[many 'good' text|]#' here'" ,
) )
. await ? ;
test ( (
"'so \"many 'go#[o|]#d' text\" here'" ,
"mi\"" ,
"'so \"#[many 'good' text|]#\" here'" ,
) )
. await ? ;
Ok ( ( ) )
}
#[ tokio::test(flavor = " multi_thread " ) ]
async fn surround_inside_pair ( ) -> anyhow ::Result < ( ) > {
// Works at first character of buffer
// TODO: Adjust test when opening pair failure is fixed
test ( ( "#[(|]#something)" , "mim" , "#[(|]#something)" ) ) . await ? ;
// Inside a valid pair selects pair
test ( ( "some (#[t|]#ext) here" , "mim" , "some (#[text|]#) here" ) ) . await ? ;
// On pair character selects pair
// TODO: Opening pair character is a known failure case that needs addressing
// test(("some #[(|]#text) here", "mim", "some (#[text|]#) here")).await?;
test ( ( "some (text#[)|]# here" , "mim" , "some (#[text|]#) here" ) ) . await ? ;
// No valid pair does nothing
test ( ( "so#[m|]#e (text) here" , "mim" , "so#[m|]#e (text) here" ) ) . await ? ;
// Count skips to outer pairs
test ( (
"(so (many (go#[o|]#d) text) here)" ,
"1mim" ,
"(so (many (#[good|]#) text) here)" ,
) )
. await ? ;
test ( (
"(so (many (go#[o|]#d) text) here)" ,
"2mim" ,
"(so (#[many (good) text|]#) here)" ,
) )
. await ? ;
test ( (
"(so (many (go#[o|]#d) text) here)" ,
"3mim" ,
"(#[so (many (good) text) here|]#)" ,
) )
. await ? ;
// Matching pairs outside selection don't match
test ( (
"((so)((many) go#[o|]#d (text))(here))" ,
"mim" ,
"((so)(#[(many) good (text)|]#)(here))" ,
) )
. await ? ;
test ( (
"((so)((many) go#[o|]#d (text))(here))" ,
"2mim" ,
"(#[(so)((many) good (text))(here)|]#)" ,
) )
. await ? ;
// Works with mixed braces
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"mim" ,
"(so [many {#[good|]#} text] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"2mim" ,
"(so [#[many {good} text|]#] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"3mim" ,
"(#[so [many {good} text] here|]#)" ,
) )
. await ? ;
// Selection direction is preserved
test ( (
"(so [many {go#[|od]#} text] here)" ,
"mim" ,
"(so [many {#[|good]#} text] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[|od]#} text] here)" ,
"2mim" ,
"(so [#[|many {good} text]#] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[|od]#} text] here)" ,
"3mim" ,
"(#[|so [many {good} text] here]#)" ,
) )
. await ? ;
// Only pairs outside of full selection range are considered
test ( (
"(so (many (go#[od) |]#text) here)" ,
"mim" ,
"(so (#[many (good) text|]#) here)" ,
) )
. await ? ;
test ( (
"(so (many#[ (go|]#od) text) here)" ,
"mim" ,
"(so (#[many (good) text|]#) here)" ,
) )
. await ? ;
test ( (
"(so#[ (many (go|]#od) text) here)" ,
"mim" ,
"(#[so (many (good) text) here|]#)" ,
) )
. await ? ;
test ( (
"(so (many (go#[od) text) |]#here)" ,
"mim" ,
"(#[so (many (good) text) here|]#)" ,
) )
. await ? ;
// Works with multiple cursors
test ( (
"(so (many (good) text) #[he|]#re\nso (many (good) text) #(|he)#re)" ,
"mim" ,
"(#[so (many (good) text) here\nso (many (good) text) here|]#)" ,
) )
. await ? ;
Ok ( ( ) )
}
#[ tokio::test(flavor = " multi_thread " ) ]
async fn surround_around_pair ( ) -> anyhow ::Result < ( ) > {
// Works at first character of buffer
// TODO: Adjust test when opening pair failure is fixed
test ( ( "#[(|]#something)" , "mam" , "#[(|]#something)" ) ) . await ? ;
// Inside a valid pair selects pair
test ( ( "some (#[t|]#ext) here" , "mam" , "some #[(text)|]# here" ) ) . await ? ;
// On pair character selects pair
// TODO: Opening pair character is a known failure case that needs addressing
// test(("some #[(|]#text) here", "mam", "some #[(text)|]# here")).await?;
test ( ( "some (text#[)|]# here" , "mam" , "some #[(text)|]# here" ) ) . await ? ;
// No valid pair does nothing
test ( ( "so#[m|]#e (text) here" , "mam" , "so#[m|]#e (text) here" ) ) . await ? ;
// Count skips to outer pairs
test ( (
"(so (many (go#[o|]#d) text) here)" ,
"1mam" ,
"(so (many #[(good)|]# text) here)" ,
) )
. await ? ;
test ( (
"(so (many (go#[o|]#d) text) here)" ,
"2mam" ,
"(so #[(many (good) text)|]# here)" ,
) )
. await ? ;
test ( (
"(so (many (go#[o|]#d) text) here)" ,
"3mam" ,
"#[(so (many (good) text) here)|]#" ,
) )
. await ? ;
// Matching pairs outside selection don't match
test ( (
"((so)((many) go#[o|]#d (text))(here))" ,
"mam" ,
"((so)#[((many) good (text))|]#(here))" ,
) )
. await ? ;
test ( (
"((so)((many) go#[o|]#d (text))(here))" ,
"2mam" ,
"#[((so)((many) good (text))(here))|]#" ,
) )
. await ? ;
// Works with mixed braces
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"mam" ,
"(so [many #[{good}|]# text] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"2mam" ,
"(so #[[many {good} text]|]# here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[o|]#d} text] here)" ,
"3mam" ,
"#[(so [many {good} text] here)|]#" ,
) )
. await ? ;
// Selection direction is preserved
test ( (
"(so [many {go#[|od]#} text] here)" ,
"mam" ,
"(so [many #[|{good}]# text] here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[|od]#} text] here)" ,
"2mam" ,
"(so #[|[many {good} text]]# here)" ,
) )
. await ? ;
test ( (
"(so [many {go#[|od]#} text] here)" ,
"3mam" ,
"#[|(so [many {good} text] here)]#" ,
) )
. await ? ;
// Only pairs outside of full selection range are considered
test ( (
"(so (many (go#[od) |]#text) here)" ,
"mam" ,
"(so #[(many (good) text)|]# here)" ,
) )
. await ? ;
test ( (
"(so (many#[ (go|]#od) text) here)" ,
"mam" ,
"(so #[(many (good) text)|]# here)" ,
) )
. await ? ;
test ( (
"(so#[ (many (go|]#od) text) here)" ,
"mam" ,
"#[(so (many (good) text) here)|]#" ,
) )
. await ? ;
test ( (
"(so (many (go#[od) text) |]#here)" ,
"mam" ,
"#[(so (many (good) text) here)|]#" ,
) )
. await ? ;
// Works with multiple cursors
test ( (
"(so (many (good) text) #[he|]#re\nso (many (good) text) #(|he)#re)" ,
"mam" ,
"#[(so (many (good) text) here\nso (many (good) text) here)|]#" ,
) )
. await ? ;
Ok ( ( ) )
}
/// Ensure the very initial cursor in an opened file is the width of
/// Ensure the very initial cursor in an opened file is the width of
/// the first grapheme
/// the first grapheme
#[ tokio::test(flavor = " multi_thread " ) ]
#[ tokio::test(flavor = " multi_thread " ) ]