mirror of
https://github.com/feigeCode/navop.git
synced 2026-09-22 00:01:25 +00:00
107 lines
3.4 KiB
Rust
107 lines
3.4 KiB
Rust
use markdown_source::{SourceMarkdownDocument, reconcile_projection};
|
|
|
|
#[test]
|
|
fn normalized_projection_does_not_rewrite_unchanged_source() {
|
|
let original = concat!(
|
|
"_italic_ and __bold__\n\n",
|
|
"2. second\n\n",
|
|
"[README](README_CN.md)\n\n",
|
|
"|A|B|\n|-|-|\n|1|2|\n"
|
|
);
|
|
let candidate = concat!(
|
|
"*italic* and **bold**\n\n",
|
|
"1. second\n\n",
|
|
"[README](<README_CN.md>)\n\n",
|
|
"| A | B |\n| :--- | :--- |\n| 1 | 2 |"
|
|
);
|
|
let document = SourceMarkdownDocument::parse(original).unwrap();
|
|
let result = reconcile_projection(&document, candidate).unwrap();
|
|
assert_eq!(original, result.document.source);
|
|
assert!(result.transaction.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn projection_edit_preserves_unrelated_markdown_bytes() {
|
|
let original = "# Title\n\n_italic_\n\n2. second\n";
|
|
let candidate = "# New Title\n\n*italic*\n\n1. second";
|
|
let document = SourceMarkdownDocument::parse(original).unwrap();
|
|
let result = reconcile_projection(&document, candidate).unwrap();
|
|
assert_eq!(
|
|
"# New Title\n\n_italic_\n\n2. second\n",
|
|
result.document.source
|
|
);
|
|
let transaction = result
|
|
.transaction
|
|
.expect("title edit should create a patch");
|
|
assert_eq!(1, transaction.edits.len());
|
|
}
|
|
|
|
#[test]
|
|
fn inline_edit_preserves_unedited_markers_in_the_same_paragraph() {
|
|
let original = "Use _snake_case(value)_ and old text.\n";
|
|
let candidate = "Use *snake_case(value)* and new text.";
|
|
let document = SourceMarkdownDocument::parse(original).unwrap();
|
|
let result = reconcile_projection(&document, candidate).unwrap();
|
|
assert_eq!(
|
|
"Use _snake_case(value)_ and new text.\n",
|
|
result.document.source
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn list_item_edit_preserves_original_ordered_marker() {
|
|
let original = "2. old text\n";
|
|
let candidate = "1. new text";
|
|
let document = SourceMarkdownDocument::parse(original).unwrap();
|
|
let result = reconcile_projection(&document, candidate).unwrap();
|
|
assert_eq!("2. new text\n", result.document.source);
|
|
}
|
|
|
|
#[test]
|
|
fn table_cell_edit_preserves_layout_and_linked_image_wrapper() {
|
|
let original = concat!(
|
|
"| Name | Preview |\n",
|
|
"| :--- | ---: |\n",
|
|
"| DB | [](database.png) |\n"
|
|
);
|
|
let candidate = concat!(
|
|
"| Name | Preview |\n",
|
|
"| :--- | ---: |\n",
|
|
"| Database |  |"
|
|
);
|
|
let document = SourceMarkdownDocument::parse(original).unwrap();
|
|
let result = reconcile_projection(&document, candidate).unwrap();
|
|
assert_eq!(
|
|
concat!(
|
|
"| Name | Preview |\n",
|
|
"| :--- | ---: |\n",
|
|
"| Database | [](database.png) |\n"
|
|
),
|
|
result.document.source
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn rich_projection_cannot_overwrite_preserved_raw_nodes() {
|
|
let original = concat!(
|
|
"# Title\n\n",
|
|
"::: custom-extension\nKeep _exactly_ this\n:::\n\n",
|
|
"After\n"
|
|
);
|
|
let candidate = concat!(
|
|
"# New Title\n\n",
|
|
"::: custom-extension\nKeep *exactly* this\n:::\n\n",
|
|
"After"
|
|
);
|
|
let document = SourceMarkdownDocument::parse(original).unwrap();
|
|
let result = reconcile_projection(&document, candidate).unwrap();
|
|
assert_eq!(
|
|
concat!(
|
|
"# New Title\n\n",
|
|
"::: custom-extension\nKeep _exactly_ this\n:::\n\n",
|
|
"After\n"
|
|
),
|
|
result.document.source
|
|
);
|
|
}
|