blerust 0.1.6

Blazing fast and robust line editor in Rust (replacement for blesh)
Documentation
use blerust::{Completer, History, LineBuffer, SyntaxHighlighter, TokenType};

#[test]
fn test_line_buffer_basic_ops() {
    let mut buf = LineBuffer::new();
    buf.insert_str("echo hello");
    assert_eq!(buf.as_str(), "echo hello");
    assert_eq!(buf.cursor(), 10);

    buf.move_word_left();
    assert_eq!(buf.cursor(), 5);

    buf.insert_str("world ");
    assert_eq!(buf.as_str(), "echo world hello");

    buf.move_cursor_end();
    assert!(buf.backspace());
    assert_eq!(buf.as_str(), "echo world hell");

    buf.undo();
    assert_eq!(buf.as_str(), "echo world hello");
}

#[test]
fn test_syntax_highlighting() {
    let hl = SyntaxHighlighter::new();
    let spans = hl.highlight("echo \"hello world\" | grep hello # test comment");
    assert!(!spans.is_empty());

    let has_builtin = spans
        .iter()
        .any(|s| s.token_type == TokenType::Builtin && s.text == "echo");
    assert!(has_builtin);

    let has_string = spans
        .iter()
        .any(|s| s.token_type == TokenType::StringLiteral);
    assert!(has_string);

    let has_op = spans
        .iter()
        .any(|s| s.token_type == TokenType::Operator && s.text == "|");
    assert!(has_op);

    let has_comment = spans.iter().any(|s| s.token_type == TokenType::Comment);
    assert!(has_comment);
}

#[test]
fn test_completion_builtins_and_lcp() {
    let completer = Completer::new();
    let (start, matches) = completer
        .complete("ec", 2)
        .expect("expected matches for 'ec'");
    assert_eq!(start, 0);
    assert!(matches.contains(&"echo".to_string()));

    let candidates = vec!["echo".to_string(), "echon".to_string()];
    let lcp = Completer::longest_common_prefix(&candidates);
    assert_eq!(lcp, "echo");
}

#[test]
fn test_history_suggestions() {
    let mut history = History::new();
    history.add("git status");
    history.add("git commit -m 'initial commit'");
    history.add("cargo build --release");

    assert_eq!(
        history.suggest_suffix("cargo "),
        Some("build --release".to_string())
    );
    assert_eq!(
        history.suggest_suffix("git c"),
        Some("ommit -m 'initial commit'".to_string())
    );
}