aboutsummaryrefslogblamecommitdiff
path: root/helix-term/tests/test/movement.rs
blob: e0bfc3bfc5e49e884606dc12a31a575498a04d9c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                                         












                                                              
            



                                    
            



                                         
            



                                          
            









                                                                        
            













                                  
            













                                  
            













                                  
            

          



                                                                    
                                                                               





                                                                              
           


                                                           
              
      

                                                                    

          
use helix_term::application::Application;

use super::*;

#[tokio::test]
async fn insert_mode_cursor_position() -> anyhow::Result<()> {
    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        TestCase {
            in_text: String::new(),
            in_selection: Selection::single(0, 0),
            in_keys: "i".into(),
            out_text: String::new(),
            out_selection: Selection::single(0, 0),
        },
    )
    .await?;

    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        ("#[\n|]#", "i", "#[|\n]#"),
    )
    .await?;

    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        ("#[\n|]#", "i<esc>", "#[|\n]#"),
    )
    .await?;

    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        ("#[\n|]#", "i<esc>i", "#[|\n]#"),
    )
    .await?;

    Ok(())
}

/// Range direction is preserved when escaping insert mode to normal
#[tokio::test]
async fn insert_to_normal_mode_cursor_position() -> anyhow::Result<()> {
    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        ("#[f|]#oo\n", "vll<A-;><esc>", "#[|foo]#\n"),
    )
    .await?;

    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        (
            indoc! {"\
                #[f|]#oo
                #(b|)#ar"
            },
            "vll<A-;><esc>",
            indoc! {"\
                #[|foo]#
                #(|bar)#"
            },
        ),
    )
    .await?;

    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        (
            indoc! {"\
                #[f|]#oo
                #(b|)#ar"
            },
            "a",
            indoc! {"\
                #[fo|]#o
                #(ba|)#r"
            },
        ),
    )
    .await?;

    test_key_sequence_text_result(
        Args::default(),
        Config::default(),
        (
            indoc! {"\
                #[f|]#oo
                #(b|)#ar"
            },
            "a<esc>",
            indoc! {"\
                #[f|]#oo
                #(b|)#ar"
            },
        ),
    )
    .await?;

    Ok(())
}

/// Ensure the very initial cursor in an opened file is the width of
/// the first grapheme
#[tokio::test]
async fn cursor_position_newly_opened_file() -> anyhow::Result<()> {
    let test = |content: &str, expected_sel: Selection| -> anyhow::Result<()> {
        let file = helpers::temp_file_with_contents(content)?;

        let mut app = Application::new(
            Args {
                files: vec![(file.path().to_path_buf(), Position::default())],
                ..Default::default()
            },
            Config::default(),
        )?;

        let (view, doc) = helix_view::current!(app.editor);
        let sel = doc.selection(view.id).clone();
        assert_eq!(expected_sel, sel);

        Ok(())
    };

    test("foo", Selection::single(0, 1))?;
    test("๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ foo", Selection::single(0, 7))?;
    test("", Selection::single(0, 0))?;

    Ok(())
}