use super::*;
#[test]
fn counts_multiply_non_operator_commands() {
let mut e = Editor::new(Buffer::from_text("abcde\n"));
e.feed_text("2x");
assert_eq!(e.buf().text().to_string(), "cde\n");
let mut e = Editor::new(Buffer::from_text("a\nb\nc\n"));
e.feed_text("dd");
e.feed_text("dd");
assert_eq!(e.buf().text().to_string(), "c\n");
e.feed_text("2u");
assert_eq!(e.buf().text().to_string(), "a\nb\nc\n");
let mut e = Editor::new(Buffer::from_text("abcde\n"));
e.feed_text("3rx");
assert_eq!(e.buf().text().to_string(), "xxxde\n"); let mut e = Editor::new(Buffer::from_text("ab\n"));
e.feed_text("yiw");
e.feed_text("2p");
assert_eq!(e.buf().text().to_string(), "aababb\n"); }
#[test]
fn counted_insert_repeats_text() {
let mut e = Editor::new(Buffer::from_text("x\n"));
e.feed_text("3iZ");
e.feed(crate::editor::Key::Esc);
assert_eq!(e.buf().text().to_string(), "ZZZx\n"); e.feed_text("u"); assert_eq!(e.buf().text().to_string(), "x\n");
}
#[test]
fn cc_keeps_the_line_and_indent() {
let mut e = Editor::new(Buffer::from_text("one\n two\nthree\n"));
e.feed_text("jccX");
e.feed(crate::editor::Key::Esc);
assert_eq!(e.buf().text().to_string(), "one\n X\nthree\n");
e.feed_text("u");
assert_eq!(e.buf().text().to_string(), "one\n two\nthree\n");
let mut e = Editor::new(Buffer::from_text("one\ntwo\nthree\n"));
e.feed_text("jcc");
e.feed(crate::editor::Key::Esc);
assert_eq!(e.buf().text().to_string(), "one\n\nthree\n");
}
#[test]
fn c_enters_insert_at_deletion_start() {
let mut e = Editor::new(Buffer::from_text("hello world\n"));
e.feed_text("wCthere");
e.feed(crate::editor::Key::Esc);
assert_eq!(e.buf().text().to_string(), "hello there\n");
let mut e = Editor::new(Buffer::from_text("abcdef\n"));
e.feed_text("3lCX");
e.feed(crate::editor::Key::Esc);
assert_eq!(e.buf().text().to_string(), "abcX\n");
}
#[test]
fn i_caret_tilde_s_work() {
let mut e = Editor::new(Buffer::from_text(" let x = 1;\n"));
e.feed_text("0^"); assert_eq!(e.head(), 4);
let mut e = Editor::new(Buffer::from_text(" let x = 1;\n"));
e.feed_text("I"); assert_eq!(e.mode, crate::editor::Mode::Insert);
assert_eq!(e.head(), 4);
e.feed(crate::editor::Key::Esc);
let mut e = Editor::new(Buffer::from_text("abc\n"));
e.feed_text("~~");
assert_eq!(e.buf().text().to_string(), "ABc\n");
let mut e = Editor::new(Buffer::from_text("one\ntwo\n"));
e.feed_text("SX");
e.feed(crate::editor::Key::Esc);
assert_eq!(e.buf().text().to_string(), "X\ntwo\n");
}
#[test]
fn rejected_commands_report_and_leave_input_reusable() {
for keys in ["=", "gZ", "dZ"] {
let mut editor = Editor::new(Buffer::from_text("abc\n"));
editor.feed_text(keys);
assert!(
!editor.message.is_empty(),
"{keys} must report its rejection"
);
assert!(
editor.walker.is_ground(),
"{keys} must release input ownership"
);
assert_eq!(editor.buf().text(), "abc\n");
editor.feed_text("l");
assert_eq!(editor.head(), 1, "a command after {keys} still executes");
}
}