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_slash_search_and_n_capital_n_repeat() {
    let mut editor = CodeEditor::new("foo zero\nbar foo\nfoo end", "txt")
        .with_vim_enabled(true);

    vim_keys(&mut editor, "/foo\n");
    assert_eq!(editor.cursor_position(), (1, 4));
    assert_eq!(editor.vim_mode(), Some(VimMode::Normal));

    vim_keys(&mut editor, "n");
    assert_eq!(editor.cursor_position(), (2, 0));
    vim_keys(&mut editor, "n");
    assert_eq!(editor.cursor_position(), (0, 0));
    vim_keys(&mut editor, "N");
    assert_eq!(editor.cursor_position(), (2, 0));
}

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

    vim_keys(&mut editor, ":4\n");
    assert_eq!(editor.cursor_position(), (3, 0));

    vim_keys(&mut editor, ":99\n");
    assert_eq!(editor.cursor_position(), (4, 0));
}

#[test]
fn vim_colon_q_and_wq_exit_vim_mode() {
    let mut quit = CodeEditor::new("one\ntwo", "txt").with_vim_enabled(true);
    vim_keys(&mut quit, ":q\n");
    assert!(!quit.vim_enabled());
    assert_eq!(quit.vim_mode(), None);
    assert_eq!(quit.content(), "one\ntwo");

    let mut write_quit =
        CodeEditor::new("one\ntwo", "txt").with_vim_enabled(true);
    vim_keys(&mut write_quit, ":wq\n");
    assert!(!write_quit.vim_enabled());
    assert_eq!(write_quit.vim_mode(), None);
    assert_eq!(write_quit.content(), "one\ntwo");
}

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

    vim_keys(&mut editor, ":w\n");

    assert!(editor.vim_enabled());
    assert_eq!(editor.vim_mode(), Some(VimMode::Normal));
    assert_eq!(editor.content(), "one\ntwo");
}

#[test]
fn vim_escape_cancels_command_without_moving() {
    let mut editor =
        CodeEditor::new("start\nfoo\nend", "txt").with_vim_enabled(true);
    let original = editor.cursor_position();

    vim_keys(&mut editor, "/foo\u{1b}");
    assert_eq!(editor.cursor_position(), original);

    vim_keys(&mut editor, "n");
    assert_eq!(editor.cursor_position(), original);
}

#[test]
fn vim_command_line_backspace_edits_search_text() {
    let mut editor =
        CodeEditor::new("start\nfoo\nend", "txt").with_vim_enabled(true);

    vim_keys(&mut editor, "/fop\u{8}o\n");

    assert_eq!(editor.cursor_position(), (1, 0));
}