iced-code-editor 0.3.11

A custom code editor widget for the Iced GUI framework with syntax highlighting, line numbers, and scrolling support.
Documentation
use iced_code_editor::{CodeEditor, Message, VimMode};

fn vim_keys(editor: &mut CodeEditor, keys: &str) {
    for key in keys.chars() {
        let _ = editor.update(&Message::VimKey(key));
    }
}

#[test]
fn vim_counted_line_jumps_use_one_based_targets() {
    let content = (1..=10)
        .map(|line| format!("line {line}"))
        .collect::<Vec<_>>()
        .join("\n");
    let mut editor = CodeEditor::new(&content, "txt").with_vim_enabled(true);

    vim_keys(&mut editor, "5G");
    assert_eq!(editor.cursor_position(), (4, 0));

    vim_keys(&mut editor, "3gg");
    assert_eq!(editor.cursor_position(), (2, 0));

    vim_keys(&mut editor, "99G");
    assert_eq!(editor.cursor_position(), (9, 0));

    vim_keys(&mut editor, "gg");
    assert_eq!(editor.cursor_position(), (0, 0));

    vim_keys(&mut editor, "G");
    assert_eq!(editor.cursor_position(), (9, 0));
}

#[test]
fn vim_bare_g_and_explicit_1g_target_different_lines() {
    let content = (1..=10)
        .map(|line| format!("line {line}"))
        .collect::<Vec<_>>()
        .join("\n");
    let mut editor = CodeEditor::new(&content, "txt").with_vim_enabled(true);

    vim_keys(&mut editor, "G");
    assert_eq!(editor.cursor_position(), (9, 0));

    vim_keys(&mut editor, "1G");
    assert_eq!(editor.cursor_position(), (0, 0));

    vim_keys(&mut editor, "5G");
    assert_eq!(editor.cursor_position(), (4, 0));

    vim_keys(&mut editor, "1gg");
    assert_eq!(editor.cursor_position(), (0, 0));
}

#[test]
fn vim_five_yy_yanks_five_lines() {
    let mut editor = CodeEditor::new("one\ntwo\nthree\nfour\nfive\nsix", "txt")
        .with_vim_enabled(true);

    vim_keys(&mut editor, "5yyp");

    assert_eq!(
        editor.content(),
        "one\none\ntwo\nthree\nfour\nfive\ntwo\nthree\nfour\nfive\nsix"
    );
    assert_eq!(editor.vim_mode(), Some(VimMode::Normal));
}

#[test]
fn vim_counted_dd_and_cc_apply_to_requested_lines() {
    let mut deleted =
        CodeEditor::new("one\ntwo\nthree\nfour\nfive\nsix\nseven", "txt")
            .with_vim_enabled(true);
    vim_keys(&mut deleted, "5dd");
    assert_eq!(deleted.content(), "six\nseven");
    assert_eq!(deleted.vim_mode(), Some(VimMode::Normal));

    let mut changed =
        CodeEditor::new("one\ntwo\nthree\nfour\nfive\nsix\nseven", "txt")
            .with_vim_enabled(true);
    vim_keys(&mut changed, "5cc");
    assert_eq!(changed.content(), "six\nseven");
    assert_eq!(changed.vim_mode(), Some(VimMode::Insert));
}