use rumdl_lib::utils::range_utils::LineIndex;
#[test]
fn test_backtick_code_fence_detection() {
let content = "# Heading\n\n```rust\nfn main() {\n println!(\"Hello\");\n}\n```\n\nText after.";
let index = LineIndex::new(content);
assert!(!index.is_code_block(0)); assert!(!index.is_code_block(1));
assert!(index.is_code_block(2)); assert!(index.is_code_block(3)); assert!(index.is_code_block(4)); assert!(index.is_code_block(5)); assert!(index.is_code_block(6));
assert!(!index.is_code_block(7)); assert!(!index.is_code_block(8)); }
#[test]
fn test_tilde_code_fence_detection() {
let content = "# Heading\n\n~~~\nSome code\nMore code\n~~~\n\nText after.";
let index = LineIndex::new(content);
assert!(!index.is_code_block(0)); assert!(!index.is_code_block(1));
assert!(index.is_code_block(2)); assert!(index.is_code_block(3)); assert!(index.is_code_block(4)); assert!(index.is_code_block(5));
assert!(!index.is_code_block(6)); assert!(!index.is_code_block(7)); }
#[test]
fn test_indented_code_block_detection() {
let content = "# Heading\n\n This is an indented code block\n More indented code\n\nText after.";
let index = LineIndex::new(content);
assert!(!index.is_code_block(0)); assert!(!index.is_code_block(1));
assert!(index.is_code_block(2)); assert!(index.is_code_block(3));
assert!(!index.is_code_block(4)); assert!(!index.is_code_block(5)); }
#[test]
fn test_tab_indented_code_block_detection() {
let content = "# Heading\n\n\tThis is a tab-indented code block\n\tMore tab-indented code\n\nText after.";
let index = LineIndex::new(content);
assert!(!index.is_code_block(0)); assert!(!index.is_code_block(1));
assert!(index.is_code_block(2)); assert!(index.is_code_block(3));
assert!(!index.is_code_block(4)); assert!(!index.is_code_block(5)); }
#[test]
fn test_nested_code_blocks() {
let content = "# Heading\n\n```markdown\n# Example markdown\n\n```code\nnested code\n```\n\nStill in outer block\n```\n\nText after.";
println!("Test content:\n{content}");
println!("\nContent by line numbers:");
content.lines().enumerate().for_each(|(i, line)| {
println!("Line {i}: '{line}'");
});
let index = LineIndex::new(content);
println!("\nContent lines with is_code_block status:");
content.lines().enumerate().for_each(|(i, line)| {
println!("Line {}: '{}' - is_code_block: {}", i, line, index.is_code_block(i));
});
assert!(!index.is_code_block(0), "Line 0 should not be in a code block"); assert!(!index.is_code_block(1), "Line 1 should not be in a code block");
assert!(index.is_code_block(2), "Line 2 should be in a code block");
assert!(index.is_code_block(3), "Line 3 should be in a code block"); assert!(index.is_code_block(4), "Line 4 should be in a code block"); assert!(index.is_code_block(5), "Line 5 should be in a code block"); assert!(index.is_code_block(6), "Line 6 should be in a code block"); assert!(index.is_code_block(7), "Line 7 should be in a code block"); assert!(index.is_code_block(8), "Line 8 should be in a code block"); assert!(index.is_code_block(9), "Line 9 should be in a code block"); assert!(index.is_code_block(10), "Line 10 should be in a code block");
assert!(!index.is_code_block(11), "Line 11 should not be in a code block"); assert!(!index.is_code_block(12), "Line 12 should not be in a code block"); }
#[test]
fn test_mixed_code_blocks() {
let content = "# Heading\n\n```\nBacktick code\n```\n\n~~~\nTilde code\n~~~\n\n Indented code\n\nText after.";
let index = LineIndex::new(content);
assert!(index.is_code_block(2)); assert!(index.is_code_block(3)); assert!(index.is_code_block(4));
assert!(index.is_code_block(6)); assert!(index.is_code_block(7)); assert!(index.is_code_block(8));
assert!(index.is_code_block(10));
assert!(!index.is_code_block(0)); assert!(!index.is_code_block(1)); assert!(!index.is_code_block(5)); assert!(!index.is_code_block(9)); assert!(!index.is_code_block(11)); assert!(!index.is_code_block(12)); }
#[test]
fn test_edge_cases() {
let empty = "";
let _empty_index = LineIndex::new(empty);
let single_line = "Just one line";
let single_line_index = LineIndex::new(single_line);
assert!(!single_line_index.is_code_block(0));
let start_code = "```\nCode at start\n```\nText after";
let start_code_index = LineIndex::new(start_code);
assert!(start_code_index.is_code_block(0));
assert!(start_code_index.is_code_block(1));
assert!(start_code_index.is_code_block(2));
assert!(!start_code_index.is_code_block(3));
let end_code = "Text before\n```\nCode at end\n```";
let end_code_index = LineIndex::new(end_code);
assert!(!end_code_index.is_code_block(0));
assert!(end_code_index.is_code_block(1));
assert!(end_code_index.is_code_block(2));
assert!(end_code_index.is_code_block(3));
let unclosed = "```\nUnclosed code block";
let unclosed_index = LineIndex::new(unclosed);
assert!(unclosed_index.is_code_block(0));
assert!(unclosed_index.is_code_block(1));
}
#[test]
fn test_is_code_fence() {
let content = "# Heading\n\n```rust\nCode\n```\n\n~~~\nMore code\n~~~";
let index = LineIndex::new(content);
assert!(index.is_code_fence(2)); assert!(index.is_code_fence(4));
assert!(index.is_code_fence(6)); assert!(index.is_code_fence(8));
assert!(!index.is_code_fence(0)); assert!(!index.is_code_fence(3)); assert!(!index.is_code_fence(7)); }
#[test]
fn test_is_tilde_code_block() {
let content = "# Heading\n\n```rust\nCode\n```\n\n~~~\nMore code\n~~~";
let index = LineIndex::new(content);
assert!(index.is_tilde_code_block(6)); assert!(index.is_tilde_code_block(8));
assert!(!index.is_tilde_code_block(2)); assert!(!index.is_tilde_code_block(4)); assert!(!index.is_tilde_code_block(0)); }
#[test]
fn test_get_content() {
let content = "# Test content";
let index = LineIndex::new(content);
assert_eq!(index.get_content(), content);
}