use probe_code::language::parser::parse_file_for_code_blocks;
use std::collections::HashSet;
#[test]
fn test_line_map_cache() {
let content = r#"
fn test_function() {
// This is a comment
let x = 42;
println!("Hello, world!");
}
struct TestStruct {
field1: i32,
field2: String,
}
"#;
let mut line_numbers = HashSet::new();
line_numbers.insert(3); line_numbers.insert(4); line_numbers.insert(8);
let result1 = parse_file_for_code_blocks(content, "rs", &line_numbers, true, None).unwrap();
println!("Cache miss result (result1) - {} blocks:", result1.len());
for (i, block) in result1.iter().enumerate() {
println!(
" Block {}: type='{}', lines={}-{}",
i,
block.node_type,
block.start_row + 1,
block.end_row + 1
);
}
let result2 = parse_file_for_code_blocks(content, "rs", &line_numbers, true, None).unwrap();
println!("Cache hit result (result2) - {} blocks:", result2.len());
for (i, block) in result2.iter().enumerate() {
println!(
" Block {}: type='{}', lines={}-{}",
i,
block.node_type,
block.start_row + 1,
block.end_row + 1
);
}
assert_eq!(
result1, result2,
"Cache miss and cache hit results should be identical"
);
let result3 = parse_file_for_code_blocks(content, "rs", &line_numbers, false, None).unwrap();
let requested_lines: Vec<usize> = line_numbers.iter().cloned().collect(); for &line in &requested_lines {
let line_covered = result3
.iter()
.any(|block| line > block.start_row && line <= block.end_row + 1);
assert!(
line_covered,
"Line {line} not covered by any block in result3"
);
}
}
#[test]
fn test_line_map_cache_with_different_content() {
let content1 = r#"
fn test_function() {
// This is a comment
let x = 42;
}
"#;
let content2 = r#"
fn test_function() {
// This is a different comment
let x = 100;
}
"#;
let mut line_numbers = HashSet::new();
line_numbers.insert(3);
let result1 = parse_file_for_code_blocks(content1, "rs", &line_numbers, true, None).unwrap();
let result2 = parse_file_for_code_blocks(content2, "rs", &line_numbers, true, None).unwrap();
assert_eq!(result1.len(), result2.len()); assert_eq!(result1[0].start_row, result2[0].start_row); assert_eq!(result1[0].end_row, result2[0].end_row); assert_eq!(result1[0].node_type, result2[0].node_type);
}