#[cfg(test)]
mod tests {
use rumdl_lib::config::MarkdownFlavor;
use rumdl_lib::lint_context::LintContext;
use rumdl_lib::rule::Rule;
fn ctx(content: &str) -> LintContext<'_> {
LintContext::new(content, MarkdownFlavor::Standard, None)
}
#[test]
fn md061_forbidden_term_column() {
use rumdl_lib::rules::MD061ForbiddenTerms;
let rule = MD061ForbiddenTerms::new(vec!["foobar".to_string()], false);
let content = "你好 foobar baz";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 4, "MD061 column must be a character offset");
assert_eq!(result[0].end_column, 10, "MD061 end_column must be character-based");
}
#[test]
fn md044_proper_name_column() {
use rumdl_lib::rules::MD044ProperNames;
let rule = MD044ProperNames::new(vec!["JavaScript".to_string()], true);
let content = "你好 javascript rocks";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 4, "MD044 column must be a character offset");
assert_eq!(result[0].end_column, 14, "MD044 end_column must be character-based");
}
#[test]
fn md037_spaces_in_emphasis_column() {
use rumdl_lib::rules::MD037NoSpaceInEmphasis;
let rule = MD037NoSpaceInEmphasis;
let content = "你好 * text *";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 4, "MD037 column must be a character offset");
assert_eq!(result[0].end_column, 12, "MD037 end_column must be character-based");
}
#[test]
fn md038_code_span_end_column() {
use rumdl_lib::rules::MD038NoSpaceInCode;
let rule = MD038NoSpaceInCode::new();
let content = "你好 `a ` baz";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 4, "MD038 column must be a character offset");
assert_eq!(result[0].end_column, 8, "MD038 end_column must be a character offset");
}
#[test]
fn md059_link_end_column() {
use rumdl_lib::rules::MD059LinkText;
let rule = MD059LinkText::default();
let content = "你好 [here](u.md) baz";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 4, "MD059 column must be a character offset");
assert_eq!(result[0].end_column, 16, "MD059 end_column must be a character offset");
}
#[test]
fn multiline_link_ranges_end_on_the_line_the_link_ends_on() {
use rumdl_lib::rules::{MD039NoSpaceInLinks, MD045NoAltText, MD051LinkFragments, MD059LinkText};
let cases: Vec<(&str, &str, usize, Box<dyn Rule>)> = vec tail\n",
8,
Box::new(MD059LinkText::default()),
),
(
"MD039",
"Some long text here [ here\n](u.md) tail\n",
8,
Box::new(MD039NoSpaceInLinks),
),
(
"MD045",
"Some long text here  tail\n",
7,
Box::new(MD045NoAltText),
),
(
"MD051",
"# H\n\nSome long text here [text](\n#nope) tail\n",
7,
Box::new(MD051LinkFragments::new()),
),
];
let mut wrong = Vec::new();
for (name, content, expected_end_column, rule) in cases {
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1, "{name} must flag the multi-line link");
let w = &result[0];
let got = (w.line, w.column, w.end_line, w.end_column);
let want = (w.line, 21, w.line + 1, expected_end_column);
if got != want {
wrong.push(format!("{name}: got {got:?}, want {want:?}"));
}
}
assert!(
wrong.is_empty(),
"multi-line link ranges are wrong:\n {}",
wrong.join("\n ")
);
}
#[test]
fn md033_html_tag_end_column() {
use rumdl_lib::rules::MD033NoInlineHtml;
let rule = MD033NoInlineHtml::default();
let content = "你好<br>x";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 3, "MD033 column must be a character offset");
assert_eq!(result[0].end_column, 7, "MD033 end_column must be a character offset");
}
#[test]
fn md049_emphasis_style_column() {
use rumdl_lib::MD049EmphasisStyle;
use rumdl_lib::rules::emphasis_style::EmphasisStyle;
let rule = MD049EmphasisStyle::new(EmphasisStyle::Asterisk);
let content = "你好 _word_ x";
let result = rule.check(&ctx(content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result[0].column, 4, "MD049 column must be a character offset");
assert_eq!(result[0].end_column, 10, "MD049 end_column must be character-based");
}
#[test]
fn md013_line_length_end_column() {
use rumdl_lib::rules::MD013LineLength;
let rule = MD013LineLength::new(80, true, true, true, false);
let content = format!("{}你好", "word ".repeat(20));
let expected = content.chars().count() + 1;
let byte_based = content.len() + 1;
assert_ne!(expected, byte_based, "test content must contain multi-byte chars");
let result = rule.check(&ctx(&content)).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(
result[0].end_column, expected,
"MD013 end_column must be a character offset"
);
}
#[test]
fn md058_table_end_column() {
use rumdl_lib::rules::MD058BlanksAroundTables;
let rule = MD058BlanksAroundTables::default();
let content = "| a | b |\n|---|---|\n| 你好 | x |\ntext\n";
let result = rule.check(&ctx(content)).unwrap();
assert!(!result.is_empty());
assert_eq!(result[0].column, 11, "MD058 column must be a character offset");
assert_eq!(result[0].end_column, 12, "MD058 end_column must be a character offset");
}
}