use loro::LoroDoc;
#[test]
fn test_text_update() -> anyhow::Result<()> {
let (old, new, new1) = (")+++", "%", "");
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update(old, Default::default()).unwrap();
assert_eq!(&text.to_string(), old);
text.update(new, Default::default()).unwrap();
assert_eq!(&text.to_string(), new);
text.update(new1, Default::default()).unwrap();
assert_eq!(&text.to_string(), new1);
Ok(())
}
#[test]
fn test_text_update_by_line() -> anyhow::Result<()> {
let (old, new, new1) = (
"Hello\nWorld\n",
"Hello\nLoro\nWorld\n",
"Hello Loro!\nAwesome World!\n",
);
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update_by_line(old, Default::default()).unwrap();
assert_eq!(&text.to_string(), old);
text.update_by_line(new, Default::default()).unwrap();
assert_eq!(&text.to_string(), new);
text.update_by_line(new1, Default::default()).unwrap();
assert_eq!(&text.to_string(), new1);
Ok(())
}
#[test]
fn test_text_update_empty_to_nonempty() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update("", Default::default()).unwrap();
assert_eq!(&text.to_string(), "");
text.update("Hello, Loro!", Default::default()).unwrap();
assert_eq!(&text.to_string(), "Hello, Loro!");
Ok(())
}
#[test]
fn test_text_update_nonempty_to_empty() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update("Initial content", Default::default()).unwrap();
assert_eq!(&text.to_string(), "Initial content");
text.update("", Default::default()).unwrap();
assert_eq!(&text.to_string(), "");
Ok(())
}
#[test]
fn test_text_update_with_special_characters() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update("Special chars: !@#$%^&*()", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Special chars: !@#$%^&*()");
text.update("New special chars: ñáéíóú", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "New special chars: ñáéíóú");
Ok(())
}
#[test]
fn test_text_update_by_line_with_empty_lines() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update_by_line("Line 1\n\nLine 3\n", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Line 1\n\nLine 3\n");
text.update_by_line("Line 1\nLine 2\n\nLine 4\n", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Line 1\nLine 2\n\nLine 4\n");
Ok(())
}
#[test]
fn test_text_update_by_line_with_different_line_endings() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update_by_line("Line 1\nLine 2\r\nLine 3\n", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Line 1\nLine 2\r\nLine 3\n");
text.update_by_line("Line 1\r\nLine 2\nLine 3\r\n", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Line 1\r\nLine 2\nLine 3\r\n");
Ok(())
}
#[test]
fn test_text_update_by_line_with_no_trailing_newline() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update_by_line("Line 1\nLine 2\nLine 3", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Line 1\nLine 2\nLine 3");
text.update_by_line("Line 1\nLine 2\nLine 3\nLine 4", Default::default())
.unwrap();
assert_eq!(&text.to_string(), "Line 1\nLine 2\nLine 3\nLine 4");
Ok(())
}
#[test]
fn weird_char() -> anyhow::Result<()> {
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.insert(0, "\0好").unwrap();
text.delete(0, 2).unwrap();
assert_eq!(&text.to_string(), "");
Ok(())
}
#[test]
fn test_failed_case_0() -> anyhow::Result<()> {
let input = ["\u{1}", "\0տ", ""];
let (old, new, new1) = (input[0], input[1], input[2]);
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update(old, Default::default()).unwrap();
text.update(new, Default::default()).unwrap();
assert_eq!(&text.to_string(), new);
text.update_by_line(new1, Default::default()).unwrap();
assert_eq!(&text.to_string(), new1);
Ok(())
}
#[test]
fn test_failed_case_1() -> anyhow::Result<()> {
let input = ["", "\u{1f}", "\u{b8ef8}"];
let (old, new, new1) = (input[0], input[1], input[2]);
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update(old, Default::default()).unwrap();
text.update(new, Default::default()).unwrap();
assert_eq!(&text.to_string(), new);
text.update_by_line(new1, Default::default()).unwrap();
assert_eq!(&text.to_string(), new1);
Ok(())
}
#[test]
fn test_failed_case_2() -> anyhow::Result<()> {
let input = ["\0\0\t\0\u{1}", "'\u{1}\u{15}", ""];
let (old, new, new1) = (input[0], input[1], input[2]);
let doc = LoroDoc::new();
let text = doc.get_text("text");
text.update(old, Default::default()).unwrap();
text.update(new, Default::default()).unwrap();
assert_eq!(&text.to_string(), new);
text.update_by_line(new1, Default::default()).unwrap();
assert_eq!(&text.to_string(), new1);
Ok(())
}