mod common;
use common::conv_with;
use mdka::options::{ConversionMode, ConversionOptions};
const MODES: [ConversionMode; 5] = [
ConversionMode::Balanced,
ConversionMode::Strict,
ConversionMode::Minimal,
ConversionMode::Semantic,
ConversionMode::Preserve,
];
fn assert_matrix(label: &str, html: &str, expected: [&str; 5]) {
for (mode, exp) in MODES.iter().zip(expected.iter()) {
let opts = ConversionOptions::for_mode(*mode);
let out = conv_with(html, &opts);
assert_eq!(&out, exp, "{label} / {mode} mismatch");
}
}
#[test]
fn block_with_markdown_form_p() {
assert_matrix("block <p>", "<p>Hello</p>", ["Hello\n"; 5]);
}
#[test]
fn block_with_markdown_form_h2() {
assert_matrix("block <h2>", "<h2>Hello</h2>", ["## Hello\n"; 5]);
}
#[test]
fn inline_with_markdown_form_a() {
assert_matrix(
"inline <a>",
r#"<p><a href="https://example.com">link</a></p>"#,
["[link](https://example.com)\n"; 5],
);
}
#[test]
fn inline_with_markdown_form_code() {
assert_matrix("inline <code>", "<p><code>x</code></p>", ["`x`\n"; 5]);
}
#[test]
fn inline_with_markdown_form_strong() {
assert_matrix(
"inline <strong>",
"<p><strong>x</strong></p>",
["**x**\n"; 5],
);
}
#[test]
fn inline_without_markdown_form_span() {
assert_matrix(
"inline w/o form <span>",
r#"<p><span class="hl">x</span></p>"#,
["x\n"; 5],
);
}
#[test]
fn generic_block_container_div() {
assert_matrix(
"generic block <div>",
r#"<div class="wrap"><p>Inner</p></div>"#,
["Inner\n"; 5],
);
}
#[test]
fn unknown_tag() {
assert_matrix(
"unknown tag",
"<custom-tag>Hello</custom-tag>",
["Hello\n"; 5],
);
}
#[test]
fn void_element_br() {
assert_matrix("void <br>", "<p>A<br>B</p>", ["A \nB\n"; 5]);
}
#[test]
fn void_element_hr() {
assert_matrix("void <hr>", "<p>A</p><hr><p>B</p>", ["A\n\n---\n\nB\n"; 5]);
}
#[test]
fn void_element_img() {
assert_matrix(
"void <img>",
r#"<p><img src="a.png" alt="A"></p>"#,
["\n"; 5],
);
}
#[test]
fn always_skipped_script() {
assert_matrix(
"always-skipped <script>",
"<p>A</p><script>alert(1)</script><p>B</p>",
["A\n\nB\n"; 5],
);
}
#[test]
fn always_skipped_svg() {
assert_matrix(
"always-skipped <svg>",
"<p>A</p><svg><circle/></svg><p>B</p>",
["A\n\nB\n"; 5],
);
}
#[test]
fn always_skipped_head() {
assert_matrix(
"always-skipped <head>",
"<html><head><title>T</title></head><body><p>Z</p></body></html>",
["Z\n"; 5],
);
}
#[test]
fn shell_element_nav() {
assert_matrix(
"shell <nav>",
r#"<nav><a href="/">Home</a></nav><main><p>Content</p></main>"#,
[
"[Home](/)\n\nContent\n", "[Home](/)\n\nContent\n", "Content\n", "[Home](/)\n\nContent\n", "[Home](/)\n\nContent\n", ],
);
}
#[test]
fn shell_element_footer() {
assert_matrix(
"shell <footer>",
"<footer>Foot</footer><p>Body</p>",
[
"Foot\n\nBody\n", "Foot\n\nBody\n", "Body\n", "Foot\n\nBody\n", "Foot\n\nBody\n", ],
);
}
#[test]
fn figure_and_figcaption_never_unwrapped() {
assert_matrix(
"figure/figcaption",
r#"<figure><img src="a.png" alt="A"><figcaption>Cap</figcaption></figure>"#,
["\n\nCap\n"; 5],
);
}
#[test]
fn attribute_rich_element_is_identical_across_all_modes() {
assert_matrix(
"attribute-rich <p>",
r#"<p id="pid" class="pclass" data-k="v" aria-label="lbl" style="color:red" foo="bar">Hi</p>"#,
["Hi\n"; 5],
);
}