use rumdl_lib::lint_context::LintContext;
use rumdl_lib::rule::Rule;
use rumdl_lib::rules::{ListStyle, MD029OrderedListPrefix};
#[test]
fn test_root_level_code_block_separates_lists() {
let content = r#"1. First item
2. Second item
```
code block at root level
```
1. This should be item 1 (new list)
2. This should be item 2 (new list)
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
for issue in &result {
assert!(
!issue.message.contains("expected 3") && !issue.message.contains("expected 4"),
"Root-level code blocks should separate lists. Found: {}",
issue.message
);
}
assert_eq!(
result.len(),
0,
"No MD029 errors expected when lists are properly separated by code blocks"
);
}
#[test]
fn test_indented_code_block_does_not_separate_lists() {
let content = r#"1. First item
2. Second item
```
code block indented as list content
```
3. This should be item 3 (same list)
4. This should be item 4 (same list)
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert_eq!(
result.len(),
0,
"No MD029 errors expected when code block is properly indented as list content"
);
}
#[test]
fn test_tilde_fenced_code_block_separates_lists() {
let content = r#"1. First item
2. Second item
~~~python
print("tilde-fenced code block")
~~~
1. This should be item 1 (new list)
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
for issue in &result {
assert!(
!issue.message.contains("expected 3"),
"Tilde-fenced code blocks should separate lists. Found: {}",
issue.message
);
}
assert_eq!(
result.len(),
0,
"No MD029 errors expected when lists are separated by tilde-fenced code blocks"
);
}
#[test]
fn test_indented_code_block_3_spaces_continues_list() {
let content = r#"1. First item
2. Second item
```
3 spaces - sufficient for list continuation
```
3. This should be item 3 (same list continues)
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert_eq!(
result.len(),
0,
"No MD029 errors expected when code block is properly indented as list content"
);
}
#[test]
fn test_indented_code_block_2_spaces_insufficient() {
let content = r#"1. First item
2. Second item
```
only 2 spaces - insufficient for list continuation
```
1. This should be item 1 (new list)
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert_eq!(
result.len(),
0,
"No MD029 errors expected when code block has insufficient indentation"
);
}
#[test]
fn test_mixed_code_block_scenarios() {
let content = r#"1. First item
2. Second item
```
root level code block
```
1. New list item 1
2. New list item 2
```
properly indented code block
```
3. Continues same list (item 3)
```
another root level code block
```
1. Another new list starts at 1
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert_eq!(
result.len(),
0,
"No MD029 errors expected in mixed code block scenario with proper separation"
);
}
#[test]
fn test_code_block_with_language_specification() {
let content = r#"1. Item one
2. Item two
```python
# Python code with language specification
def hello():
print("Hello, world!")
```
1. Should be item 1 of new list
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
for issue in &result {
assert!(
!issue.message.contains("expected 3"),
"Code blocks with language specs should separate lists. Found: {}",
issue.message
);
}
assert_eq!(
result.len(),
0,
"No MD029 errors expected when lists are separated by language-specified code blocks"
);
}
#[test]
fn test_code_block_separates_lists_basic() {
let content = r#"1. First item
2. Second item
```
code block
```
1. This should be item 1 (new list starts)
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
assert_eq!(
result.len(),
0,
"Code blocks should separate lists - no MD029 errors expected"
);
}
#[test]
fn test_edge_case_empty_code_block() {
let content = r#"1. First item
```
```
1. Should be item 1 of new list
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
for issue in &result {
assert!(
!issue.message.contains("expected 2"),
"Empty code blocks should separate lists. Found: {}",
issue.message
);
}
}
#[test]
fn test_code_block_immediately_after_list_no_blank_line() {
let content = r#"1. First item
2. Second item
```
code block right after list
```
1. Should be item 1 of new list
"#;
let rule = MD029OrderedListPrefix::new(ListStyle::Ordered);
let ctx = LintContext::new(content, rumdl_lib::config::MarkdownFlavor::Standard, None);
let result = rule.check(&ctx).unwrap();
for issue in &result {
assert!(
!issue.message.contains("expected 3"),
"Code blocks immediately after lists should separate them. Found: {}",
issue.message
);
}
}