use scrive_core::{Document, EditOp, EolFlavor, GroupingHint, OpClass};
fn key(doc: &mut Document, at: u32, text: &str) {
doc.edit_grouped(vec![EditOp::insert(at, text)], GroupingHint::mergeable(OpClass::Type))
.unwrap();
}
#[test]
fn a_full_editing_session() {
let mut doc = Document::new("").unwrap();
assert_eq!(doc.text(), "");
assert!(!doc.is_dirty());
assert_eq!(doc.revision().0, 0);
for (i, ch) in "hello world".chars().enumerate() {
key(&mut doc, i as u32, &ch.to_string());
}
assert_eq!(doc.text(), "hello world");
assert!(doc.is_dirty());
doc.mark_saved();
assert!(!doc.is_dirty());
doc.edit(vec![EditOp::new(0..1, "H"), EditOp::new(6..7, "W")]).unwrap();
assert_eq!(doc.text(), "Hello World");
assert!(doc.is_dirty());
assert!(doc.undo());
assert_eq!(doc.text(), "hello world");
assert!(!doc.is_dirty());
assert!(doc.redo());
assert_eq!(doc.text(), "Hello World");
assert!(doc.is_dirty());
assert!(doc.undo()); assert!(doc.undo()); assert_eq!(doc.text(), "");
assert!(!doc.undo(), "nothing left to undo");
key(&mut doc, 0, "bye");
assert_eq!(doc.text(), "bye");
assert!(!doc.redo(), "divergent edit cleared the redo branch");
doc.edit(vec![EditOp::insert(3, "\r\nline2")]).unwrap(); assert_eq!(doc.text(), "bye\nline2"); assert_eq!(doc.buffer().line_count(), 2);
assert_eq!(doc.serialize(EolFlavor::CrLf), "bye\r\nline2");
assert_eq!(doc.serialize(EolFlavor::Lf), "bye\nline2");
}
#[test]
fn multi_range_undo_restores_every_span() {
let mut doc = Document::new("a a a a").unwrap();
doc.edit(vec![
EditOp::new(0..1, "X"),
EditOp::new(2..3, "X"),
EditOp::new(4..5, "X"),
EditOp::new(6..7, "X"),
])
.unwrap();
assert_eq!(doc.text(), "X X X X");
assert!(doc.undo());
assert_eq!(doc.text(), "a a a a", "all four spans restored by one undo");
assert!(doc.redo());
assert_eq!(doc.text(), "X X X X");
}