#[cfg(test)]
mod tests {
use crate::editor::Editor;
use strop_core::Buffer;
fn text(e: &Editor) -> String {
e.buf().rope.to_string()
}
#[test]
fn q_toggles_at_point_and_motions_move_all() {
let mut e = Editor::new(Buffer::from_text("one\ntwo\nthree\n"));
e.feed_text("Q");
assert_eq!(e.extra_cursors, vec![0]);
e.feed_text("j"); assert_eq!(e.cursor, 4);
assert_eq!(e.extra_cursors, vec![4]);
e.feed_text("Q"); assert!(e.extra_cursors.is_empty());
}
#[test]
fn space_c_stacks_down_a_column() {
let mut e = Editor::new(Buffer::from_text("one\ntwo\nthree\n"));
e.feed_text(" c"); assert_eq!(e.extra_cursors, vec![4]);
e.feed_text(" c");
assert_eq!(e.extra_cursors, vec![4, 8]); e.feed_text(" c"); assert_eq!(e.extra_cursors, vec![4, 8]);
}
#[test]
fn delete_cascades_and_undoes_as_one_unit() {
let mut e = Editor::new(Buffer::from_text("foo a\nfoo b\n"));
e.feed_text(" c"); e.feed_text("dw");
assert_eq!(text(&e), "a\nb\n");
e.feed_text("u"); assert_eq!(text(&e), "foo a\nfoo b\n");
}
#[test]
fn change_flows_into_mirrored_insert() {
let mut e = Editor::new(Buffer::from_text("x = 1\ny = 2\n"));
e.feed_text(" c");
e.feed_text("cw"); e.feed_text("val");
e.feed(crate::editor::Key::Esc);
assert_eq!(text(&e), "val = 1\nval = 2\n");
e.feed_text("u"); assert_eq!(text(&e), "x = 1\ny = 2\n");
}
#[test]
fn esc_collapses_to_primary() {
let mut e = Editor::new(Buffer::from_text("a\nb\nc\n"));
e.feed_text(" c");
e.feed_text(" c");
assert_eq!(e.extra_cursors.len(), 2);
e.feed(crate::editor::Key::Esc);
assert!(e.extra_cursors.is_empty());
}
#[test]
fn stacked_cursors_edit_once() {
let mut e = Editor::new(Buffer::from_text("word here\n"));
e.feed_text("Q"); e.feed_text("dw"); assert_eq!(text(&e), "here\n");
e.feed_text("u");
e.feed_text("i"); e.feed_text("Z");
e.feed(crate::editor::Key::Esc);
assert_eq!(text(&e), "Zword here\n");
}
#[test]
fn paste_cascades_to_every_cursor() {
let mut e = Editor::new(Buffer::from_text("aa\nbb\n"));
e.feed_text("yiw"); e.feed_text(" c"); e.feed_text("e"); e.feed_text("p"); assert_eq!(text(&e), "aaaa\nbbaa\n");
}
#[test]
fn n_cascades_to_every_cursor() {
let mut e = Editor::new(Buffer::from_text("1 foo\n2 foo\n3 foo\n"));
e.feed_text(" c"); e.feed_text("/foo\r");
assert_eq!(e.cursor, 2);
assert_eq!(e.extra_cursors, vec![8]); }
#[test]
fn extra_cursors_render_without_panicking() {
let mut e = Editor::new(Buffer::from_text("one\ntwo\nthree\n"));
e.feed_text(" c");
let frame = crate::headless::frame_string(&mut e, 40, 10);
assert!(frame.contains("one") && frame.contains("two"));
}
}