use rumdl_lib::rule::Rule;
use rumdl_lib::rules::MD043RequiredHeadings;
#[test]
fn test_matching_headings() {
let required = vec![
"# Introduction".to_string(),
"# Methods".to_string(),
"# Results".to_string(),
];
let rule = MD043RequiredHeadings::new(required);
let content = "# Introduction\n\n# Methods\n\n# Results";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
}
#[test]
fn test_missing_heading() {
let required = vec![
"# Introduction".to_string(),
"# Methods".to_string(),
"# Results".to_string(),
];
let rule = MD043RequiredHeadings::new(required);
let content = "# Introduction\n\n# Results";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(!result.is_empty());
let fixed = rule.fix(&ctx).unwrap();
assert_eq!(fixed, content);
}
#[test]
fn test_extra_heading() {
let required = vec!["# Introduction".to_string(), "# Results".to_string()];
let rule = MD043RequiredHeadings::new(required);
let content = "# Introduction\n\n# Methods\n\n# Results";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(!result.is_empty());
let fixed = rule.fix(&ctx).unwrap();
assert_eq!(fixed, content);
}
#[test]
fn test_wrong_order() {
let required = vec![
"# Introduction".to_string(),
"# Methods".to_string(),
"# Results".to_string(),
];
let rule = MD043RequiredHeadings::new(required);
let content = "# Introduction\n\n# Results\n\n# Methods";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(!result.is_empty());
let fixed = rule.fix(&ctx).unwrap();
assert_eq!(fixed, content);
}
#[test]
fn test_empty_required_headings() {
let required = vec![];
let rule = MD043RequiredHeadings::new(required);
let content = "# Any heading\n\n# Another heading";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let fixed = rule.fix(&ctx).unwrap();
assert_eq!(fixed, content);
}
#[test]
fn test_case_sensitive() {
let required = vec!["# Introduction".to_string()];
let rule = MD043RequiredHeadings::new(required);
let content = "# INTRODUCTION";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty()); }
#[test]
fn test_mixed_heading_styles() {
let required = vec!["# Introduction".to_string(), "======= Methods".to_string()];
let rule = MD043RequiredHeadings::new(required);
let content = "# Introduction\nContent\nMethods\n=======";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
}
#[test]
fn test_asterisk_wildcard_integration() {
let required = vec!["# README".to_string(), "*".to_string(), "## License".to_string()];
let rule = MD043RequiredHeadings::new(required);
let content = "# README\n\n## Installation\n\n## Usage\n\n### Examples\n\n## License";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let content = "# README\n\n## License";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
}
#[test]
fn test_plus_wildcard_integration() {
let required = vec![
"# Documentation".to_string(),
"+".to_string(),
"## Contributing".to_string(),
];
let rule = MD043RequiredHeadings::new(required);
let content = "# Documentation\n\n## API\n\n## Contributing";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let content = "# Documentation\n\n## Contributing";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(!result.is_empty());
}
#[test]
fn test_question_wildcard_integration() {
let required = vec![
"?".to_string(),
"## Description".to_string(),
"## Installation".to_string(),
];
let rule = MD043RequiredHeadings::new(required);
let content = "# My Awesome Project\n\n## Description\n\n## Installation";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let content = "# Another Project\n\n## Description\n\n## Installation";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let content = "## Description\n\n## Installation";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(!result.is_empty());
}
#[test]
fn test_real_world_documentation_pattern() {
let required = vec![
"?".to_string(), "## Overview".to_string(), "*".to_string(), "## Installation".to_string(), "*".to_string(), "## License".to_string(), ];
let rule = MD043RequiredHeadings::new(required);
let content = "# MyLib\n\n## Overview\n\n## Installation\n\n## License";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let content = "# MyLib\n\n## Overview\n\n## Features\n\n## Screenshots\n\n## Installation\n\n## Usage\n\n## API Reference\n\n## Examples\n\n## License";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(result.is_empty());
let content = "# MyLib\n\n## Overview\n\n## Features\n\n## License";
let ctx = rumdl_lib::lint_context::LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert!(!result.is_empty());
}