use moss_core::ast::editor_scan::editor_scan;
use moss_core::ast::shortcode::ShortcodeKind;
use moss_core::ast::shortcode_extract::extract_shortcodes;
fn kind_name(kind: ShortcodeKind) -> &'static str {
match kind {
ShortcodeKind::Subscribe => "subscribe",
ShortcodeKind::Buttons => "buttons",
ShortcodeKind::Gallery => "gallery",
ShortcodeKind::Hero => "hero",
ShortcodeKind::Grid => "grid",
ShortcodeKind::Recent => "recent",
ShortcodeKind::Apply => "apply",
}
}
fn check_parity(markdown: &str, fixture_name: &str) {
let scan_result = editor_scan(markdown);
let extract_result = extract_shortcodes(markdown);
let scan_names: Vec<&str> = scan_result.blocks.iter().map(|b| b.name.as_str()).collect();
let extract_names: Vec<&str> = extract_result
.extracted
.iter()
.map(|e| kind_name(e.shortcode.kind()))
.collect();
assert_eq!(
scan_names.len(),
extract_names.len(),
"fixture '{fixture_name}': block count mismatch\n scan: {scan_names:?}\n extract: {extract_names:?}"
);
for (i, (sn, en)) in scan_names.iter().zip(extract_names.iter()).enumerate() {
assert_eq!(
sn, en,
"fixture '{fixture_name}' block {i}: name mismatch — scan='{sn}' extract='{en}'"
);
}
}
#[test]
fn nested_arity_parity() {
let md = include_str!("../../../tests/fixtures/parser-parity/nested-arity.md");
check_parity(md, "nested-arity");
}
#[test]
fn gallery_single_block_parity() {
let md = include_str!("../../../tests/fixtures/parser-parity/hyphenated-names.md");
check_parity(md, "hyphenated-names");
}
#[test]
fn hyphenated_name_editor_scan_recognises_unknown() {
use moss_core::ast::editor_scan::editor_scan;
use moss_core::ast::shortcode_extract::extract_shortcodes;
let md = ":::my-widget\nbody\n:::\n";
let scan = editor_scan(md);
let extract = extract_shortcodes(md);
assert_eq!(scan.blocks.len(), 1, "editor_scan must recognise :::my-widget");
assert_eq!(scan.blocks[0].name, "my-widget");
assert_eq!(extract.extracted.len(), 0,
"extract_shortcodes must return 0 typed nodes for unknown names (intentional asymmetry)");
}
#[test]
fn positional_args_parity() {
let md = include_str!("../../../tests/fixtures/parser-parity/positional-args.md");
check_parity(md, "positional-args");
}
#[test]
fn multiline_attrs_parity() {
let md = include_str!("../../../tests/fixtures/parser-parity/multiline-attrs.md");
check_parity(md, "multiline-attrs");
}